sed - 捕获一组并只替换一个字符

sed - capture a group and replace only one character

我有以下问题,文件格式如下:

1XYZ00

所以结果会是

2XYZ00

我只想将第一个数字更改为另一个数字,例如 9,其余模式不做任何更改。

我真的需要捕捉这个模式 1XYZ00 并且只有这个模式并将第一个数字替换为另一个。 我这个文件可以有数字,但有不同的模式,不能修改。

OS是分OS7.

这是我测试过的

sed -E 's/1{1}[A-Z]{3}[0-9]{2}/9{1}[A-Z]{3}[0-9]{2}/g' ~/input.txt > ~/output.txt

我也试过捕获组:

sed --debug -E -r 's/1\(1{1}[A-Z]{3}[0-9]{2}\)/9/g' ~/input.txt > ~/output.txt

sed 的调试模式告诉我模式匹配但没有进行替换。

我想我已经很接近了,请问有专家可以帮助我吗?

非常感谢,

我不确定这对你来说是否足够。

sed -i 's/1/9/' input.txt
$ cat ip.txt
foo 1XYZ00
xyz 1 2 3
hi 3XYZ00
1XYZ0A
cool 3ABC23

$ # matches any number followed by 3 uppercase and 2 digit characters
$ sed -E 's/[0-9]([A-Z]{3}[0-9]{2})/9/' ip.txt
foo 9XYZ00
xyz 1 2 3
hi 9XYZ00
1XYZ0A
cool 9ABC23

$ # matches digit '1' followed by 3 uppercase and 2 digit characters
$ sed -E 's/1([A-Z]{3}[0-9]{2})/9/' ip.txt
foo 9XYZ00
xyz 1 2 3
hi 3XYZ00
1XYZ0A
cool 3ABC23

OP 尝试的问题:

  • 1{1}[A-Z]{3}[0-9]{2} 等同于 1[A-Z]{3}[0-9]{2}
  • 在替换部分使用 9{1}[A-Z]{3}[0-9]{2} 将为您提供这些字符。它们没有任何特殊含义。
  • s/1\(1{1}[A-Z]{3}[0-9]{2}\)/9/ 这个确实使用了捕获组,但是 () 不应该在 -E 选项处于活动状态时进行转义,并且 1{1} 不应该是捕获组的一部分