ファイルのパターンを別のファイルの内容に置き換える

ファイルのパターンを別のファイルの内容に置き換える

テキストファイル()がありますdevel.xml

temp.txt文字列を別のファイル()の内容に置き換えるために、REPLACETHISという単語を追加しました。

私が得た最も近いものは次のとおりです。

sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;

文字列の後に内容を挿入してから文字列を削除します。

これが最善の方法ですか?

ベストアンサー1

ファイルに表示されるすべての場所を削除しSUBSTITUTETHIS(残りの行は削除しません)、その行のtemp.TXT下にコンテンツを挿入するだけです。 1行に複数回発生すると、最初のSUBSTITUTETHIS発生のみが削除され、1つのコピーのみが追加さtemp.TXTれます。

発生時に行全体を置き換えるには、SUBSTITUTETHISこのdコマンドを使用します。両方を同時に実行する必要があるため、一致するものがあればrサポートdグループに入れてください。

sed -e '/SUBSTITUTETHIS/ {' -e 'r temp.TXT' -e 'd' -e '}' -i devel.txt

一部のsed実装では、セミコロンを使用してコマンドを区切り、中括弧の周りの区切り文字を完全に省略できますが、コマンド引数を終了するには改行文字が必要ですr

sed -e '/SUBSTITUTETHIS/ {r temp.TXT
                          d}' -i devel.txt

ファイルの内容を変更したいのですが、SUBSTITUTETHISその前後の内容を維持すればもっと複雑になります。最も簡単な方法は、sedコマンドにファイルの内容を含めることです。内容を正しく引用する必要があります。

sed -e "s/SUBSTITUTETHIS/$(<temp.TXT sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' | tr -d '\n')/g" -i devel.txt

またはパールを使用してください。これは短いですが、cat交換ごとに一度実行されます。

perl -pe 's/SUBSTITUTETHIS/`cat temp.TXT`/ge' -i devel.txt

スクリプトの起動時にファイルを一度読み込み、シェルコマンドに依存しないようにするには:

perl -MFile::Slurp -pe 'BEGIN {$r = read_file("temp.TXT"); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

(読みやすくするために2行でマークしましたが、改行は省略できます。)ファイル名が変数の場合は、引用の問題を避けるために環境変数を介してスクリプトに渡してください。

replacement_file=temp.TXT perl -MFile::Slurp -pe 'BEGIN {$r = read_file($replacement_file); chomp($r)}
                        s/SUBSTITUTETHIS/$r/ge' -i devel.txt

おすすめ記事