web-dev-qa-db-ja.com

文字列をファイルに置換または追加します

私はsedが次のようにテキストファイル内の文字列を置き換えることができることを知っています:

sed -i 's/oldstring/newstring/g' test.txt

しかし、行が存在する場合はどのように置き換え、存在しない場合は新しい行に自動的に追加しますか?

ありがとう。

編集:ご回答ありがとうございます。あなたのコメントと回答のリクエストごとに、ここに詳細があります:

  • 古い文字列の存在を確認し、存在する場合は新しい文字列に置き換えます。
  • 古い文字列が存在しない場合、txtファイルの最後の新しい行に新しい文字列を追加したい
  • 同じ文字列が複数回出現する場合、設定ファイルなのでエラーになります。他の出現は、最初の出現を置き換えた後に削除できます。
4
Josh

これを行う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
9
terdon

これにより、必要なものが達成されます。

grep -q "oldstring" test.txt
if [ $? -eq 1 ]; then
    echo "newstring" >> test.txt
else
    sed -i 's/oldstring/newstring/g' test.txt
fi
2
Sadi

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
1
kos