sed 正则表达式不工作

sed 正则表达式不工作

正则表达式查找长度为 46 的数字或小写字母并在末尾附加 0。

C:\Users\svuppula>echo "0020000000000000100000000000000000000000000001" | sed -e 's/[0-9a-z]{45}/\10/g'
sed: -e expression #1, char 20: invalid reference \1 on `s' command's RHS

grep 在哪里工作

C:\Users\svuppula>echo "0020000000000000100000000000000000000000000001" | grep -E '[0-9a-z]{45}'
"0020000000000000100000000000000000000000000001"

版本:

C:\Users\svuppula>sed --version

sed (GNU sed) 4.2.2

C:\Users\svuppula>grep --version

grep (GNU grep) 2.24

答案1

\1指的是括号中的第一组,但你没有。添加括号,或用于&填充整个匹配字符串:

$ echo "foobar" | sed -e 's/foo/&ABC/'
fooABCbar
$ echo "foobar" | sed -re 's/(foo)/\1ABC/'
fooABCbar

请注意,您需要-r在 GNU sed 中使用括号,并且还要与{NN}计数匹配。 (除非你想对所有这些都使用丑陋的反斜杠转义符。)

所以:

echo "0020000000000000100000000000000000000000000001" | sed -re 's/([0-9a-z]{45})/\19/g'
00200000000000001000000000000000000000000000091

该数字字符串有 46 个字符长,但正则表达式仅匹配 45 个字符,因此在最后一个数字之前添加了 9 个字符。如果您只想处理恰好包含 45 个字符的行,请将正则表达式锚定到行的开头和结尾。

$ echo "002000000000000010000000000000000000000000001" | sed -re 's/^[0-9a-z]{45}$/&9/g'
0020000000000000100000000000000000000000000019

(我将添加的数字更改为 9,这样它就不会与输入中的零混合。)

相关内容