我想替换一个字符串' abc'使用' xyz',但还有其他字符串也包含' abc',例如' abcdef'。我想只替换' abc'的完全匹配,而不是' abc'在' abcef'。我将如何在linux中实现这一目标?
谢谢!
答案 0 :(得分:2)
您需要使用“完全匹配”。例如,使用简单搜索并通过call "%ServiceFolder%\bat\stopService.bat" >nul 2>&1
替换会产生您不想要的行为:
代码清单(有缺陷的案例)
sed
示例(有缺陷的案例)
echo "abc abcd abcdef" | sed 's/abc/xyz/g'
但是,如果您使用xyz xyzd xyzdef
<
V形符号包装搜索查询(需要使用反斜杠进行转义),那么您可以选择:
代码(工作案例)
>
示例(工作案例)
echo "abc abcd abcdef" | sed 's/\<abc\>/xyz/g'
答案 1 :(得分:0)
您可以使用行结束限制字符$
来完成您想要的操作。例如:
$ 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