linux sed替代正则表达式失败

时间:2017-08-14 11:08:30

标签: regex sed

所以我有以下正则表达式,但不适用于sed

regex101

^(\S*HTTPS*_SERVER\S*)(\s*'https*:\/\/)(\S*)('\);)$

以及file.txt中的文字:

define('HTTP_SERVER', 'http://localhost:31270');
define('HTTPS_SERVER', 'https://localhost:31270');

然后当我尝试做的时候:

sed -i.bak -r 's/^\(\S*HTTPS*_SERVER\S*\)\(\s*\'https*:\/\/\)\(\S*\)\(\'\);\)$/\1\2test.com\4/' file.txt

它没有做任何事情。

这里有什么想法吗?是因为逃避的炭?

2 个答案:

答案 0 :(得分:1)

由于您使用的是POSIX ERE语法(-r选项),因此使用一对未转义 ()来定义捕获组。此外,由于模式中有',因此需要在s/.../.../命令周围使用doulbe引号。

使用

sed -i.bak -r "s/^(\S*HTTPS*_SERVER\S*)(\s*'https*:\/\/)(\S*)('\);)$/\1\2test.com\4/" file.txt

查看online demo

请注意,您可以使用/以外的分隔符来避免在模式中转义/个符号(例如,您可以使用"s,<pattern>,<replacement>,",因为模式本身没有逗号)。 Besdies,根据这个主题,如果你真的需要使用单引号的正则表达式定义,你可以用一个'实体替换模式中的文字\x27

此外,如果您不需要在第1组和第2组之间插入任何文本,您可以将两个组模式合并为一个,并且 - 当您删除第3组时,您甚至不会需要抓住它。

所以,替代方案看起来像

sed -r 's,^(\S*HTTPS*_SERVER\S*\s*\x27https*://)\S*(\x27\);)$,\1test.com\2,' file.txt

请参阅another online demo

答案 1 :(得分:1)

您可以减少捕获组的数量:

sed -E -i.bak "s/^(define\('HTTPS?_SERVER', 'https?:\/\/)[^']*('\);)/\1test.com\2/" file.txt