Linux – 如何replace一个string,而不是以包含它的其他模式删除它

我想用'xyz'replace一个string'abc',但是还有其他string也包含'abc',例如'abcdef'。 我只想replace'abc'中的精确匹配,而不是'abcef'中的'abc'。 我将如何完成在Linux?

谢谢!

你需要使用“完全匹配”。 例如,使用简单的搜索和通过sed替换生成的行为,你不希望:

代码清单(案例错误)

 echo "abc abcd abcdef" | sed 's/abc/xyz/g' 

示例(案例错误)

 xyz xyzd xyzdef 

然而,如果你用< > V形符号(他们需要用一个反斜杠转义)包装你的搜索查询,那么你很好:

代码(工作案例)

 echo "abc abcd abcdef" | sed 's/\<abc\>/xyz/g' 

示例(工作案例)

 xyz abcd abcdef 

你可以使用行结束限制字符$来完成你想要的。 例:

 $ echo abcdef | sed -e 's/abc$/.../' abcdef $ echo abc | sed -e 's/abc$/.../' ... 

这将只匹配abc没有任何以下字符。 (它会匹配123abc )。 为了进一步限制匹配只有字符串abc单独使用上面结合行字符的开头^

 $ echo abcdef | sed -e 's/^abc$/.../' abcdef $ echo abc | sed -e 's/^abc$/.../' ... $ echo 123abc | sed -e 's/^abc$/.../' 123abc 

使用行开始和行结束限制字符,您可以限制替换只有abc

如果你的shell是bash ,你想使用内建=~运算符来测试脚本中的正则表达式,而不依赖像sed这样的外部工具,那么你可以用下面的方法完成同样的事情:

 #!/bin/bash s1=${1:-abcdef} pat=${2:-abc} rep=${3:-...} printf "\n string: %s pattern: %s replacement: %s\n" $s1 $pat $rep [[ $s1 =~ ^${pat}$ ]] && s1=${s1/$pat/$rep} printf "\n final string: %s\n\n" $s1 exit 0 

产量

 $ bash strpatrep.sh string: abcdef pattern: abc replacement: ... final string: abcdef $ bash strpatrep.sh abc string: abc pattern: abc replacement: ... final string: ... $ bash strpatrep.sh 123abc string: 123abc pattern: abc replacement: ... final string: 123abc