web-dev-qa-db-ja.com

ファイル内のアポストロフィを含むパターンを置き換えます

この行を含むテキストファイルがあります。

set stime = '0 0'

それを次のように変更する必要があります。

set stime = '0 4'

私はこれらのコマンドを試しました:

sed -i 's/original/new/g' file.txt

そして

awk '{gsub(/pattern/,"replacement")}' file 

しかし、それらは機能しません。パターンのアポストロフィが原因だと思います。これを正しく行うにはどうすればよいですか?

7
deepblue

単一引用符'をエスケープするには、二重引用符"を使用する必要があります。

インプレースで更新するには、sed -iを使用する必要があります

次のコードはインプレースで更新し、一重引用符をエスケープする必要があります。

sed -i "s/set stime = '0 0'/set stime = '0 4'/g" input_file_name
8
Yaron

いくつかの選択肢があります。

  1. Sedまたはawkコマンドには、一重引用符ではなく二重引用符を使用します。

    sed -i "s/set stime = '0 0'/set stime = '0 4'/g" file
    

    または

    awk "{gsub(/set stime = '0 0'/,\"set stime = '0 4'\")}1;" file 
    
  2. パターンをシェル変数に保存し、二重引用符を使用します。

    replacement="set stime = '0 4'"
    pattern="set stime = '0 0'"
    

    それから

    sed "s/$pattern/$replacement/g" file
    

    または

    awk -vpat="$pattern" -vrep="$replacement" '{gsub(pat,rep)}1;' file 
    
  3. パターン全体を使用しないでください。正しい行を見つけて、変更する必要があるものだけを置き換えて、引用符を避けてください。たとえば、set stimeが1つしか存在しない場合、次のことができます。

    sed '/set stime/{s/0 0/0 4/}' file 
    

    または

    awk '$1=="set" && $2=="time"{sub("0 0","0 4")}1' file
    
5
terdon