ファイル内のパターンを他のファイルのコンテンツで置き換える


20

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

この文字列を別のファイル内のコンテンツに置き換えるために、単語REPLACETHISを追加しました(temp.txt)。

私が持っている最も近いものはこれです:

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

これにより、文字列の後にコンテンツが挿入され、その後文字列が削除されます。

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


sedする必要がありますか?temp.txtに含まれるテキストの量に応じて、perlソリューションに進むことができます。
user17591

回答:


34

あなたがやったことはSUBSTITUTETHIS、ファイル内のどこにでも(ただし、それが現れる行の残りの部分ではなく)削除し、temp.TXTその行の下の内容を挿入することです。SUBSTITUTETHIS1行に複数回出現する場合、最初の出現のみが削除され、1つのコピーのみtemp.TXTが追加されます。

SUBSTITUTETHIS表示されたときに行全体を置換する場合は、dコマンドを使用します。あなたは両方を実行する必要があるためrd一致があるとき、ブレースのグループに入れ。

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

またはPerlを使用します。これは短いですがcat、置換ごとに1回実行されます。

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

スクリプトの開始時にファイルを1回読み取り、シェルコマンドに依存しないようにするには:

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

どうすればperlコマンドを変更cat temp.txtできますcat ${variable}か?
マリアイネスパルニサリ

@MariaInesParnisariコメントのフォーマットを間違えました。わずかに異なる、より堅牢なソリューションで、私の答えを参照してください。
ジル「SO-悪であるのをやめる」

File :: Slurpは常にインストールされるとは限らないため、代わりに-0777スイッチを使用してファイル全体をopenperl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
slurpし

r temp.TXT「BEGIN temp.TXT」、「END temp.TXX」などのメッセージでラップする方法
kyb

私の質問に対する解決策を見つけました。a(追加)コマンドを使用します。grymoire.com/Unix/Sed.html#uh-36
kyb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.