sedを使用してテキストブロックで複数の置換を実行するには?

sedを使用してテキストブロックで複数の置換を実行するには?

次のパターンのブロックを含むテキストファイルがあります。

# 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の返信

関連情報