使用sed替换之前和之后具有非字母数字字符的字符串

时间:2018-12-18 15:00:52

标签: linux string bash sed

我想使用sed命令,以便用其他字符串替换特定的字符串。 但是,我想跳过在它们之前的最后一个字符或在它们之后的第一个字符为字母数字的字符串出现。 这意味着我只希望在字符串前后都有非字母数字字符的情况下替换这些字符串。

我尝试了很多方法并在网上搜索,但没有结果。

例如: 字符串是:

aaaBCD] BCD1 [BCD] BCD.

如果我尝试将BCDBBB交换,我希望仅替换最后两个BCD

2 个答案:

答案 0 :(得分:0)

您可以将\<\>用作锚点:

sed 's/\<BCD\>/BBB/'

但是,这不涉及下划线。因此,将其扩展为

sed -e 's/\<BCD\>/BBB/' -e 's/_BCD\>/_BBB/' -e 's/\<BCD_/BBB_/' -e 's/_BCD_/_BBB_/'

编辑:实际上,您可以使用扩展的正则表达式的 OR 以及Jay jargot回答中的模式子字符串将所有命令组合为一个命令。通过 -E 开关将sed扩展为正则表达式:

sed -E 's/((_|\<))BCD((_|\>))/\1BBB\3/g'

顺便说一下,在这里您可以找到有关sed,awk,正则表达式的漂亮教程。

  

http://www.grymoire.com/Unix/

答案 1 :(得分:0)

[:alnum:]代表字母数字,因此[^[:alnum:]]可用于非字母数字字符。

尝试以下操作:

printf '%s\n' 'aaaBCD] BCD1 [BCD] BCD' |\
  sed 's/^BCD$/BBB/ ; s/^BCD\([^[:alnum:]]\)/BBB\1/ ; s/\([^[:alnum:]]\)BCD\([^[:alnum:]]\)/\1BBB\2/g ; s/\([^[:alnum:]]\)BCD$/\1BBB/'

输出

aaaBCD] BCD1 [BBB] BBB