一部のテキストと新しいコンテンツを追加する場所を示すマークが1行に含まれるファイルがあります。
foo
bar
%SUBSTITUTE%
foo
1行ずつ置き換えるものは、新しい複数行の文字列で置き換える必要がありますtext="some text"
(文字列がわからないことに注意してください。たとえば、cat "file"ファイルを読み取った結果ですtext=
)。代替結果は次のようになります。
foo
bar
some text
%SUBSTITUTE%
foo
動作が停止した作業バージョンがありましたperl
(明らかにPerlバージョンの変更により)。これで、tr
同じ標準ユーティリティを使用してその行をsed
置き換えようとしています。貼り付ける文字列にバックスラッシュなどの任意の文字を含めることができるため、問題が発生しました。貼り付ける前にこれらの文字をエスケープしたくありません。
標準ツールを使用してこれを行う安全な方法はありますか?この問題について私が見つけた他の問題は、貼り付けられていることが知られているテキストの特定の解決策です。
ベストアンサー1
sedのGNUバージョンがある場合は、そのr
コマンドを使用してファイルから読み取り、新しい内容を挿入してから、表示された行を削除できます。
sed '/%SUBSTITUTE%/{
r path/to/newcontent
d
}' file
%SUBSTITUTE%
タグを維持したい場合後ろに挿入してください。何をしても、GNUr
拡張はファイルの内容をキューに入れるので難しいです。終わり現在のモード周期(継続)今後コマンドを削除するだけですd
。)おそらく最も簡単な方法はファイルに追加することですnewcontent
。次のようにすぐに実行できます。
sed '/%SUBSTITUTE%/{
r /dev/stdin
d
}' file < <(sed '$a %SUBSTITUTE%' path/to/newcontent)
まったく異なるアプローチを使用すると、最初のファイルを分割し%SUBSTITUTE%
て新しいコンテンツを追加できます。
csplit -s file '/%SUBSTITUTE%/'
cat xx00 newcontent xx01
最初のファイルの行に対してbashループを実行し、タグ文字列が一致したときに新しいファイルの内容をキャプチャすることもできますread
。しかし、このフォーラムで提案されているように、テキスト処理のためのループを読むことはすでに不安です。残念ながら、どちらも適切な解決策を提供しません。