找到并替换,但不是在字母或数字附近

时间:2011-12-10 23:45:33

标签: bash sed replace

使用sed,我可以将一个项目替换为另一个项目。 E.g:

sed -i "s/a/b/g" file

然而,有时候我不希望这种替代发生。如何确保更换仅在以下时间发生:

  • 之前的字符不是字母,数字或{
  • 紧接其后的字符不是字母或数字,或}

2 个答案:

答案 0 :(得分:1)

这是一种方式:

% echo '2a: {a} a cat.' | sed -e 's/\([^{[:alnum:]]\)a\([^}[:alnum:]]\)/\1b\2/g'
2a: {a} b cat.

在替换中存储和使用的\(...\)表单组引用\1\2,... \9

答案 1 :(得分:0)

sed -r -e "s/([^0-9a-zA-Z\{])a([^0-9a-zA-Z\}])/\1b\2/g"

([^0-9a-zA-Z\{]) - 是第一个匹配的符号组(当前情况下长度为1)。不是数字(0-9),不是字母(a-zA-Z)而不是{(\{)。

([^0-9a-zA-Z\}]) - 是第二个匹配的组,就像第一个一样。

如果我们匹配这些序列,我们会将其替换为第一组(\1),b和第二组(\2)。