テキストファイル(devel.xml
)があります。
この文字列を別のファイル内のコンテンツに置き換えるために、単語REPLACETHISを追加しました(temp.txt
)。
私が持っている最も近いものはこれです:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
これにより、文字列の後にコンテンツが挿入され、その後文字列が削除されます。
これが最善の方法ですか?
テキストファイル(devel.xml
)があります。
この文字列を別のファイル内のコンテンツに置き換えるために、単語REPLACETHISを追加しました(temp.txt
)。
私が持っている最も近いものはこれです:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
これにより、文字列の後にコンテンツが挿入され、その後文字列が削除されます。
これが最善の方法ですか?
回答:
あなたがやったことはSUBSTITUTETHIS
、ファイル内のどこにでも(ただし、それが現れる行の残りの部分ではなく)削除し、temp.TXT
その行の下の内容を挿入することです。SUBSTITUTETHIS
1行に複数回出現する場合、最初の出現のみが削除され、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
または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
cat temp.txt
できますcat ${variable}
か?
-0777
スイッチを使用してファイル全体をopen
perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
r temp.TXT
「BEGIN temp.TXT」、「END temp.TXX」などのメッセージでラップする方法
a
(追加)コマンドを使用します。grymoire.com/Unix/Sed.html#uh-36