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)。若要进一步将匹配

我想将字符串“abc”替换为“xyz”,但还有其他字符串也包含“abc”,例如“abcdef”。我只想替换'abc'的精确匹配,而不是'abcef'中的'abc'。在linux中如何实现这一点


谢谢

您可以使用行尾限制字符
$
完成所需操作。例如:

$ 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