![使用 sed 替换文本并在特定模式后添加文本](https://linux22.com/image/201382/%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E6%96%87%E6%9C%AC%E5%B9%B6%E5%9C%A8%E7%89%B9%E5%AE%9A%E6%A8%A1%E5%BC%8F%E5%90%8E%E6%B7%BB%E5%8A%A0%E6%96%87%E6%9C%AC.png)
我正在寻找在特定模式之后替换文件内的文本。
例如:
的内容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
答案1
以下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
只是修改该行的匹配部分。因此前面的部分==
将被保留,并且后面的部分只==
需要一个捕获组。
两种模式的行为差异在于.*==
... 将匹配最后一个,==
而==
... 将匹配第一个,因为该.*
部分匹配后面的最长可能文本==
。