Sed

如何在文本塊上使用 sed 執行多重替換?

  • October 5, 2021

我有文本文件,其中有一個具有如下模式的塊:

# 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/^Jit/開頭的模式greps 行和其他步驟進行替換。日期可以是任何東西,所以我不能硬編碼這些,因此需要匹配一個模式。

期望的輸出:

Jit .... enabled=false
Jit ..shoes.. From=2021-01-01
Jit ..gloves.. From=2021-01-01

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修飾符,因為您似乎每行只出現一次模式。

引用自:https://unix.stackexchange.com/questions/671899