我想用'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