使用 sed 替换文本并在特定模式后添加文本

使用 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

答案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只是修改该行的匹配部分。因此前面的部分==将被保留,并且后面的部分只==需要一个捕获组。

两种模式的行为差异在于.*==... 将匹配最后一个,====... 将匹配第一个,因为该.*部分匹配后面的最长可能文本==

相关内容