次のパターンのブロックを含むテキストファイルがあります。
# cat file
Jit .... enabled=false
Jit ..shoes.. From=2021-01-01
Jit ..gloves.. From=2021-01-01
だから私は一致する正規表現をすべて変更して、次の行を含むsedファイルを作成したいと思います。
# cat sedfile
/^Jit/ {
s/enabled=false/enabled=true/g
s/From=\d+-\d+-\d+/From=2021-02-01/g
}
パターン/^Jit/
grep 行は次から始まります。Git交換する他の手順もあります。日付は何でも構いません。ハードコードできないため、パターンが一致する必要があります。
希望の出力:
Jit .... enabled=false
Jit ..shoes.. From=2021-01-01
Jit ..gloves.. From=2021-01-01
答え1
sedはわかりません\d
。標準[0-9]
文字クラスを使用してください。
$ cat sedfile
/^Jit/ {
s/enabled=false/enabled=true/
s/From=[0-9]+-[0-9]+-[0-9]+/From=2021-02-01/
}
これにより、次のことができます。
line1
Jit .... enabled=false
Jit .... From=2021-01-01
line4
$ sed -Ef sedfile file
line1
Jit .... enabled=true
Jit .... From=2021-02-01
line4
またはスクリプトファイルなし:
$ sed -E '/^Jit/{s/enabled=false/enabled=true/; s/From=[0-9]+-[0-9]+-[0-9]+/From=2021-02-01/}' file
line1
Jit .... enabled=true
Jit .... From=2021-01-01
line4
g
パターンが1行に1回しか表示されないため、修飾子を削除しました。
答え2
私は(より包括的なサンプルが入力されるまで)行の終わりパターンが厳しいと仮定する解決策を思いつきました。もしそうなら、より複雑なマッチングは必要ありません。
/^Jit/{
s/false$/true/
s/[0-9\-]\+$/2021-02-01/
}'
出力:
Jit .... enabled=true
Jit .... From=2021-02-01
g
削除されたフラグについては、以下を参照してください。@terdonの返信。