Linux-如何替换字符串而不在包含它的其他模式中删除它
我想将字符串“abc”替换为“xyz”,但还有其他字符串也包含“abc”,例如“abcdef”。我只想替换'abc'的精确匹配,而不是'abcef'中的'abc'。在linux中如何实现这一点Linux-如何替换字符串而不在包含它的其他模式中删除它,linux,terminal,Linux,Terminal,我想将字符串“abc”替换为“xyz”,但还有其他字符串也包含“abc”,例如“abcdef”。我只想替换'abc'的精确匹配,而不是'abcef'中的'abc'。在linux中如何实现这一点 谢谢 您可以使用行尾限制字符$完成所需操作。例如: $ echo abcdef | sed -e 's/abc$/.../' abcdef $ echo abc | sed -e 's/abc$/.../' ... 它将只匹配abc,不包含任何以下字符。(但是,它将匹配123abc)。若要进一步将匹配
谢谢 您可以使用行尾限制字符
$
完成所需操作。例如:
$ 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
你需要使用“精确匹配”。例如,通过sed
使用简单的搜索和替换生成您不想要的行为:
代码列表(错误案例)
示例(故障案例)
但是,如果您使用
V形符号(它们需要用反斜杠转义)包装搜索查询,则可以:
代码(工作案例)
这个解决方案够了吗?@zedfoxus谢谢!这就是我要找的!
echo "abc abcd abcdef" | sed 's/abc/xyz/g'
xyz xyzd xyzdef
echo "abc abcd abcdef" | sed 's/\<abc\>/xyz/g'
xyz abcd abcdef