Linux
使用 sed 替換文本並在特定模式後添加文本
我正在尋找以某種模式替換文件中的文本。
例如:
的內容
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
解釋與僅修改行的匹配部分的區別相似。所以之前的部分==
將被保留,之後的部分只需要一個擷取組==
。兩種模式行為的不同之處在於
.*==
… 將匹配最後一個==
,而==
… 將匹配第一個,因為該.*
部分匹配後面跟隨的最長可能文本==
。