我正在寻找以某种模式替换文件中的文本。
例如:
的内容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。随着输入
输出是
要就地编辑文件,请添加选项
-i
和输入文件的名称:解释:
图案:
.
= 任何字符*
= 前面的模式从 0 重复到任意数字.*
= 任意数量的任意字符\(
...\)
= 捕获与封闭模式匹配的文本==
= 文字文本\(.*\)==\(.*\)
= 作为第 1 组捕获的==
任何文本,然后是作为第 2 组捕获的任何文本替代品:
\1
,\2
= 来自捕获组 1 或 2 的文本\1>=\2,<\2+1.0
=组 1 组 2>=
组,<
2+1.0
正如他们
==
的评论中提到的,可以省略文字之前的第一个模式,从而导致sed
解释与仅修改行的匹配部分的差异相似。所以之前的部分==
将被保留,之后的部分只需要一个捕获组==
。两种模式行为的不同之处在于
.*==
... 将匹配最后一个==
,而==
... 将匹配第一个,因为该.*
部分匹配后面跟随的最长可能文本==
。