Linux

使用 sed 替換文本並在特定模式後添加文本

  • January 25, 2022

我正在尋找以某種模式替換文件中的文本。

例如:

的內容example.txt

Something==x.y.z

我想把它改成

Something>=x.y.z,<x.y.z+1.0

我知道我可以sed -i 's/==/>=/g' example.txt用來改變==但我不知道<x.y.z+1.0在某個模式之後添加。

請注意x.y.z是隨機數

**編輯:**它適用於 Python 包。例子

argcomplete==1.12.3
youtube-dl==2021.6.6
systemd-python==234

會成為

argcomplete>=1.12.3,<1.12.3+1.0
youtube-dl>=2021.6.6,<2021.6.6+1.0
systemd-python>=234,<234+1.0

以下sed命令假定該行中恰好有一個==,並將其前後的部分提取為可用於替換的組 1 和 2。

sed 's/\(.*\)==\(.*\)/\1>=\2,<\2+1.0/'

隨著輸入

Something==x.y.z
argcomplete==1.12.3
youtube-dl==2021.6.6
systemd-python==234

輸出是

Something>=x.y.z,<x.y.z+1.0
argcomplete>=1.12.3,<1.12.3+1.0
youtube-dl>=2021.6.6,<2021.6.6+1.0
systemd-python>=234,<234+1.0

要就地編輯文件,請添加選項-i和輸入文件的名稱:

sed -i 's/\(.*\)==\(.*\)/\1>=\2,<\2+1.0/' example.txt 

解釋:

圖案:

  • .= 任何字元
  • *= 前面的模式從 0 重複到任意數字
  • –> .*= 任意數量的任意字元
  • \(\)= 擷取與封閉模式匹配的文本
  • === 文字文本
  • \(.*\)==\(.*\)= 作為第 1 組擷取的==任何文本,然後是作為第 2 組擷取的任何文本

替代品:

  • \1, \2= 來自擷取組 1 或 2 的文本
  • 其他部分在這裡是文字
  • \1>=\2,<\2+1.0=組 1 組 2 >= ,< 2 +1.0

正如他們==的評論中提到的,可以省略文字之前的第一個模式,從而導致

sed 's/==\(.*\)/>=\1,<\1+1.0/'

sed解釋與僅修改行的匹配部分的區別相似。所以之前的部分==將被保留,之後的部分只需要一個擷取組==

兩種模式行為的不同之處在於.*==… 將匹配最後一個==,而==… 將匹配第一個,因為該.*部分匹配後面跟隨的最長可能文本==

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