首页 > 解决方案 > 使用 sed 替换前后有非字母数字字符的字符串

问题描述

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

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

例如:字符串是:

aaaBCD] BCD1 [BCD] BCD.

如果我尝试用 交换BCDBBB我只想BCD替换最后两个。

标签: linuxstringbashsed

解决方案


您可以使用\<and\>作为锚点:

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/


推荐阅读