正则表达式查找长度为 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,这样它就不会与输入中的零混合。)