私はsedが次のようにテキストファイル内の文字列を置き換えることができることを知っています:
sed -i 's/oldstring/newstring/g' test.txt
しかし、行が存在する場合はどのように置き換え、存在しない場合は新しい行に自動的に追加しますか?
ありがとう。
編集:ご回答ありがとうございます。あなたのコメントと回答のリクエストごとに、ここに詳細があります:
これを行う1つの方法は、grep
を方程式に取り込むことです。最初にファイルにクイックgrep
の文字列が含まれているかどうかを確認し、それに応じて追加または置換します。
grep -q string file &&
sed -i 's/string/newstring/' file || echo "newstring" >> file
上記は簡単な記述方法です。
if grep -q string file; then
sed -i 's/string/newstring/' file
else
echo "newstring" >> file
fi
ただし、個人的には、代わりにPerl
を使用します。一度ファイルを読み取って、置換が行われた場合は変数を1に設定するだけです。次に、変数が1でない場合、最後に文字列を追加します。
Perl -lpe '$i=1 if s/oldstring/newstring/;
END{print "newstring" if $i!=1;}' file > tmpfile && mv tmpfile file
これにより、必要なものが達成されます。
grep -q "oldstring" test.txt
if [ $? -eq 1 ]; then
echo "newstring" >> test.txt
else
sed -i 's/oldstring/newstring/g' test.txt
fi
AWKの使用:
<<<"$(<in)" awk '{if(/foo/){x=sub(/foo/, "bar", $0)};print}END{if(x!=1){print "bar"}}' >in
% cat in1
string oldstring string
% cat in2
string foo string
% <<<"$(<in1)" awk '{if(/oldstring/){x=sub(/oldstring/, "newstring", $0)};print}END{if(x!=1){print "newstring"}}' >in1
user@user-X550CL ~/tmp % cat in1
string newstring string
% <<<"$(<in2)" awk '{if(/oldstring/){x=sub(/oldstring/, "newstring", $0)};print}END{if(x!=1){print "newstring"}}' >in2
% cat in2
string foo string
newstring