入力する:
Select ASDF 325 sdfg sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg sdfg 4456 sdrg
出力:
Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg
つまり、「sed」「sdfg」を「XXXX」に変換する必要があります。
ただし、「Select ASDF」文字列を含む行でのみ可能です。どうすればいいですか? (sed, awk など:\)
答え1
ほとんどのsedコマンドの前に以下を付けることができます。住所適用される行を制限します。アドレスは行番号または区切りの正規表現です/
。
cat INPUT | sed '/Select ASDF/ s=sdfg=XXXX='
Peter.Oが述べたように、上記のコマンドは埋め込まれsdfg
た文字列に最初に現れるものを置き換えますSelect ASDF
。正確に一致する項目をsdfg
4列目の大文字と小文字に置き換えるには、次の手順を実行する必要があります。
cat INPUT | sed 's/\(^Select ASDF [^ ]* \)sdfg /\1XXXX /'
答え2
列4のみを変更する場合(正確な値がある場合)、正規表現の代わりに等しい演算子を使用することをお勧めします。
awk '$1 == "Select" && $2 == "ASDF" && $4 == "sdfg" {$4 = "XXXX"} {print}'
答え3
使用GNU awk
:
awk '
BEGIN { IGNORECASE = 1 }
/^select asdf/ {
sub( /\<sdfg\>/, "XXXX", $0 )
}
{ print }
' infile
出力:
Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg
修正する:IGNORECASE
GNU以外の用途では使用しないでくださいawk
。一致するかどうかは大文字と小文字を区別します。ありがとうjw013、彼は次のように詳細を指摘した。
awk '
/^Select ASDF/ {
sub( /\<sdfg\>/, "XXXX", $0 )
}
{ print }
' infile