ファイル内の2つのマーカー間のテキストを別のファイルのテキストのセクションに置き換える方法は?


8

にテキストのブロックがあったとしましょう~/.bashrc

#~/.bashrc
# ...some commands...

# aliases
alias suicide='sudo rm -rf /'
# end aliases

# other commands

そのテキストブロックを別のファイルの2つのマーカーの間に含まれる他のテキストで置き換えたいと思います。 stuff-to-place-in-bashrc.txt

# stuff-to-place-in-bashrc.txt
# ...stuff...

# aliases
alias ldir='ls * -d'
alias ithinklifeisworthliving='echo all good'
# end aliases

# ...more stuff...

私はもう試した

 sed -ne 's/# aliases\s+\(.*\)\s+# end aliases/\1/' stuff-to-place-in-bashrc.txt

しかし、私はここで暗闇の中で本当に揺れています。誰かが私を助けてくれませんか?

  1. からテキストを抽出するにはどうすればよいstuff-to-place-in-bashrc.txtですか?

  2. の他のセクション~/.bashrcを質問1から抽出したテキストに置き換えるにはどうすればよいですか?

編集する

アップデートの人たちに感謝します、なぜ私はこのようなものが欲しいのか疑問に思っています:

ユーザーが作成した追加を上書きすることなく、スクリプトファイルへの最適な更新を可能にします。共有され、頻繁に更新される標準オペレーティング環境(XPでコード化されたTyroでの最後の仕事など)に役立ちます。

クレイジーな人に行きます。


また、Cプリプロセスファイルの波括弧内のテキストキャプチャするも参照してください。「中かっこ」を開始トークンと終了トークン(# aliasesおよび# end aliases)で変更すると、うまくいく場合があります。

回答:


9

Edは標準のエディターです。これを使用して、edスクリプトを開発し、以前にテストしたようにインタラクティブに機能させることができます。.bashrcedやコードテキストなどの小さなファイルの場合、edはファイル全体を1つのラッシュで読み取り、バッファで動作するため、パフォーマンスが優れています。同じ理由で、ログファイルなどの大きなファイルにはedを使用しないでください。

しかし、edスクリプトを使用すると、作業はすぐに完了します。

ed ~/.bashrc<<EOF
/^# aliases
+,/^# end aliases/-1d
-r !sed -n '/^# aliases/,/^# end aliases/p' stuff-to-place-in-bashrc.txt|grep -v '^#'
w
q
EOF

同様のスクリプトを使用して、ラップトップを使用するさまざまな環境に合わせてals .asoundrcなどの構成ファイルを自動的に調整します。

edに関する最良のドキュメントは、非常にクールなPLAN9システムのシンプルなマニュアルページとして提供されます。私はそれをed.ps postscriptドキュメントに翻訳しました。PLAN9に興味がある場合は、オリジナルのbell labsバージョンがまだ維持されていますが、非常に単純なファイルシステムであるため、9frontおよびhttp://cat-v.org/を確認する必要があります。

編集戦争、emacs、vimなどに関する最後の言葉:acmeルール!


答えてくれてありがとう、うまくいきましたが、構文が何であるかわかりません。それは正規表現またはエドにもっと特定の何かを使用していますか?vimのようなコマンド(wq)があるようです
thenaglecode

正規表現(/^# aliases、および/^# end aliases/)を使用し、他のコマンドはVi / Edです。たとえば、vimhelp.appspot.com / cmdline.txt.html#%3Arange forを参照してください+, /^# end aliases/
muru

1
info Ed(うまくいけば)あなたのシステムで見てください。最近のLinuxディストリビューションがこのクールなエディターをインストールしない理由はわかりません。wおよびqは、書き込みおよび終了コマンドです。edは、sedとregexeが非常によく似ています。名前が同じように聞こえるのには理由があります。dは指定された行を削除することを意味し、-rは後続の!コマンドの結果を前の行に読み込みます。私は今朝早く怠惰なタイピングをしているので、編集でファイル名を短くしました。
ikrabbe

1
@thenaglecodeは私の最後の編集を参照してください。投稿する前にテストする必要がありました。
ikrabbe

1
Plan9のからページ私が今までに必要な1とEDについてだけは本当に良いページはED(1)であった@thenaglecodeは:man.cat-v.org/plan_9/1/edあなたのような場合、私はあなたのポストスクリプトバージョンを送ることができます。今はplan9について話しているだけなので、acmeエディターも参照してください。それに慣れたら、他のものを使うことはありません。もちろん、たとえばLinuxボックス内の仮想マシンとしてplan9システムを使用するのが最善ですが、UNIX用のp9pポートも素晴らしいです。(plan9 edとgnu edの違いはほとんどありません!)
ikrabbe

2
set /^\#aliases/  /^\#end\ aliases/
sed -ne"$1,$2"'s/\\\{0,1\}/&&/gp' <stuff_to_place...rc |
sed -e"$1,$2c\" -f- ./infile >./outfile

その場でファイルを編集したい場合edは、非常に良い解決策です。インストリームで編集する場合は、を使用しますsed。避けてくださいsed -i


0

もちろん、これはed単独で行うことができ、追加のツールは必要ありません。

ed -s stuff_to_place.txt<<\IN
1,/# aliases/d
/# end aliases/,$d
,d
.r /home/username/.bashrc
/# aliases/x
.t.
.,/# end aliases/-d
,p
q
IN

あなたの結果としている満足している場合、交換してください,pw /home/username/.bashrcの変更を書き込むために~/.bashrc(で使用する完全なパスをメモrしてw、あなたは、単に使用することができ.bashrc、それはでいた場合cwd)。
仕組み:まずd、から不要な行を削除しstuff_to_place.txtます。次に、で残りのエイリアス(エイリアス)を削除し,dます。カットバッファーに必要な行が含まれている間、テキストバッファーは空になります。私たちは、その後rの内容をEAD .bashrc、テキストバッファにカットバッファ(の内容を入れxた後に)/# aliases/ライン、(貼り付けられた最後の行複製.t.)、その後に複製されたラインアップから削除したが含まれていない/# end aliases/し、最終的にpRINTやw儀式変更とquit。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.