Bash sed“如何逃离”;(和特殊字符转义)

Bash sed“如何逃离”;(和特殊字符转义),bash,sed,Bash,Sed,我正在尝试用sed进行以下模式替换,但它一直告诉我它找不到模式。我不知道如何正确地组合转义以使其工作 sed -i -e s_('DB_SOURCE', 'demo')_('DB_SOURCE', 'local')_ sedTest 您需要转义(,)、空白字符和”(单引号)所涉及的所有元字符,还需要将分隔符更改为#而不是 sed -e s#\(\'DB_SOURCE\',\ \'demo\'\)#\(\'DB_SOURCE\',\ \'local\'\)# file 或者在双引号(“)内使用

我正在尝试用sed进行以下模式替换,但它一直告诉我它找不到模式。我不知道如何正确地组合转义以使其工作

sed -i -e s_('DB_SOURCE', 'demo')_('DB_SOURCE', 'local')_ sedTest

您需要转义
、空白字符和
(单引号)所涉及的所有元字符,还需要将分隔符更改为
#
而不是

sed -e s#\(\'DB_SOURCE\',\ \'demo\'\)#\(\'DB_SOURCE\',\ \'local\'\)# file
或者在双引号(
)内使用整个替换。确保搜索或替换文本不包含
$
,因为变量可以在双引号下插入。在这种情况下,只需向其添加转义符(
\$



正如tripleee在评论中指出的,这里有两种解释级别,一种是sed,另一种是shell本身。在shell中,单引号之间的所有内容都是逐字解释的,单引号本身除外。sed使用基本正则表达式。在BRE中,字符
$.[\]^
需要在前面加反斜杠引用。

您需要转义
、空白字符和
(单引号)所涉及的所有元字符,还需要将分隔符改为
上的

sed -e s#\(\'DB_SOURCE\',\ \'demo\'\)#\(\'DB_SOURCE\',\ \'local\'\)# file
或者在双引号(
)内使用整个替换。确保搜索或替换文本不包含
$
,因为变量可以在双引号下插入。在这种情况下,只需向其添加转义符(
\$



正如tripleee在评论中指出的,这里有两种解释级别,一种是sed,另一种是shell本身。在shell中,单引号之间的所有内容都是逐字解释的,单引号本身除外。sed使用基本正则表达式。在BRE中,字符
$.[\]^
需要通过在它们前面加反斜杠来引用。

您可能需要在整个sed脚本周围加引号,然后在脚本中转义引号。选择一个不同于
的字符作为分隔符也可能是一个好主意,因为它出现在模式中。(我也不确定正确的解决方案,这就是为什么这只是一个评论而不是答案)有两个层次的解释,这使得新手很难理解。你需要从shell中转义这些字符中的许多,但之后也需要从
sed
中转义其中的一些。但是对于你的具体情况,lnian的答案是正确的。你可能需要在整个sed脚本中加引号,然后然后对脚本中的引号进行转义。选择一个不同于
的字符作为分隔符可能也是一个好主意,因为它出现在模式中。(我也不确定正确的解决方案,这就是为什么这只是一个注释而不是答案)有两个层次的解释,这使得新手很难理解。你需要从shell中转义这些字符中的许多,但之后也需要从
sed
中转义其中的一些。但是对于你的具体情况,lnian的答案是正确的。