不要使用 sed 命令替换文件中同一单词中第二次出现的模式

不要使用 sed 命令替换文件中同一单词中第二次出现的模式
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 }'

这仅对前两个空格分隔的字段执行替换,然后打印结果行。

相关内容