echo "abcdef12cade 12345678 abcdefba12345678" | sed -E "s/[0-9a-fA-F]{8}/00000000/g"
上面的输出如下
00000000cade 00000000 0000000000000000
它正在替换同一个单词中第二次出现的模式。如果有第二次发生我不想更换。
预期产出
00000000cade 00000000 abcdefba12345678
答案1
如果您只想替换第一次出现的匹配项,请不要使用g
命令的后缀:
$ echo 'aa' | sed 's/a/b/g'
bb
$ echo 'aa' | sed 's/a/b/'
ba
该g
选项代表“全局”,它明确指示sed
替换所有匹配项,而不仅仅是第一个匹配项(这是默认行为)。
答案2
您似乎正在寻找 8 到 15 个字符之间的单词,并替换前 8 个十六进制数字:
sed -E 's/\<[[:xdigit:]]{8}([[:xdigit:]]{0,7})\>/00000000\1/g' <<END
abcdef12cade 12345678 abcdefba12345678 12345 123456789
END
00000000cade 00000000 abcdefba12345678 12345 000000009
其中,\<
和\>
是单词边界,并且[:xdigit:]
匹配十六进制数字。
答案3
g
最后的 make 会在线sed
上尽可能多地重复替换。你只想做两次。
让我们用 GNU 来做到这一点awk
:
echo 'abcdef12cade 12345678 abcdefba12345678' |
awk '{ sub("[0-9a-fA-F]{8}", "00000000", $1)
sub("[0-9a-fA-F]{8}", "00000000", $2)
print }'
这仅对前两个空格分隔的字段执行替换,然后打印结果行。