ファイルの2つのタグの間にあるテキストを別のファイルのテキストに置き換える方法は?

ファイルの2つのタグの間にあるテキストを別のファイルのテキストに置き換える方法は?

テキストがあるとしましょう~/.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でコーディング)。

クレイジーな男。

答え1

Edは、以前にテストしたようにedスクリプトを開発し、インタラクティブにタスクを実行するために使用できるという点で標準エディタです。小さなファイル(.bashrcコードテキストなど)では、ファイル全体を一度に読み込み、バッファを使用するため、edのパフォーマンスが高くなります。同じ理由で、ログファイルなどの大容量ファイルには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

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

edのための最高のドキュメントは非常にクールでシンプルなマニュアルページから来ています。計画9システム。私はそれを次のように翻訳します。ed.psPostScriptファイル。興味があれば計画9あなたはそれを確認する必要があります9本のワイヤーそしてhttp://cat-v.org/もともとBell Labsのバージョンはまだ残っていますが、ファイルシステムは非常にシンプルだからです。

エディタ戦争、emacs、vimなどの最後の言葉:究極のルール!

答え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.Avoidを使用してくださいsed -i

答え3

もちろん、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

結果がうまくいけば、,pに置き換えてw /home/username/.bashrc変更を行います(およびで~/.bashrc使用されている完全なパスを参照してください。にある場合は単に使用できます)。仕組み:まず、不要な行を削除します。次に、を使用して残りの(エイリアス)を削除します。今、テキストバッファは空で、切り取りバッファには私たちが望む行が含まれています。次に、テキストバッファに内容を書き、行の後に切り取ったバッファ()の内容を挿入し、貼り付けた最後の行をコピーし()、コピーした行から最後のリントまたは変更を含まずに削除します。そしてええと。rw.bashrccwd
dstuff_to_place.txt,dr.bashrcx/# aliases/.t./# end aliases/pwq

関連情報