我想使用 sed 替换确切的单词

我想使用 sed 替换确切的单词

"我的目标是在文件中出现以下单词时添加双引号

VGHIER_TSV_WB798
CBVGHIER_TSV_WB798

这里

sed -i 's/"VGHIER_TSV_WB798"./VGHIER_TSV_WB798./g'

用于删除双引号(如果有)

sed -i 's/VGHIER_TSV_WB798./"VGHIER_TSV_WB798"./g'

添加引用,但当我们得到它时我遇到的问题CBVGHIER_TSV_WB798是它被替换为 CB"VGHIER_TSV_WB798",我不希望我有单独的 sed 语句来替换第二个单词

sed -i 's/CBVGHIER_TSV_WB798./"CBVGHIER_TSV_WB798"./g'

你能帮我如何达到上述要求吗?

答案1

如果您sed支持 ERE,则可以添加CB作为模式的可选部分来匹配。这将取代这两个:

sed -E 's/(CB)?VGHIER_etc/"\1VGHIER_etc"/g'  test

或者,如果您sed支持\<and\>作为单词的开头和结尾,请使用:

sed 's/\<VGHIER_etc\>/"VGHIER_etc"/g'  test

另外,模式中有一个尾随点.,它将匹配任何字符,并且它将被替换为字符串的一部分。替换中的点将放回原义点。s/foo./"foo"./更改food"foo".

答案2

我认为您想在搜索字符串中添加前导前缀。如果您尝试替换的单词前面始终带有空格:

sed -i 's/ VGHIER_TSV_WB798\./ "VGHIER_TSV_WB798"./g'

更一般地,您可以使用正则表达式分组[[:space:]]来覆盖前导空格或制表符等的情况(请参阅 参考资料man isspace完整列表)。

sed -i 's/\([[:space:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

在这种情况下,我们需要通过使用转义括号创建正则表达式分组来增加额外的复杂性,并使用反向参考 \1确保在执行替换时不会丢失确切的字符。还有一个[[:punct:]]用于标点符号的正则表达式类,以防单词前面有时出现其中一个标点符号。请参阅man isspace参考资料 获取每个正则表达式字符类所涵盖内容的完整详细列表。

这是一个更复杂的示例解决方案,涵盖可能的标点符号前缀的情况:

sed -i 's/\([[:space:]]\|[[:punct:]]\)VGHIER_TSV_WB798\./\1"VGHIER_TSV_WB798"./g'

这利用正则表达式指令|(用反斜杠转义sed)来指示替代方案。

最后,如果该单词始终是该行的第一项,请使用^正则表达式来要求:

sed -i 's/^VGHIER_TSV_WB798\./"VGHIER_TSV_WB798"./g'

是的,对于上述任何一个,您可以对您的字符串进行“分组”和“反向引用”:

sed -i 's/^\(VGHIER_TSV_WB798\)\./"\1"./g'
sed -i 's/\([[:space:]]\|[[:punct:]]\)\(VGHIER_TSV_WB798\)\./\1"\2"./g'

相关内容