Linux - 如何替换字符串而不删除包含它的其他模式中的字符串

时间:2015-09-11 20:20:18

标签: linux terminal

我想替换一个字符串' abc'使用' xyz',但还有其他字符串也包含' abc',例如' abcdef'。我想只替换' abc'的完全匹配,而不是' abc'在' abcef'。我将如何在linux中实现这一目标?

谢谢!

2 个答案:

答案 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