所以我有以下正则表达式,但不适用于sed
^(\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
它没有做任何事情。
这里有什么想法吗?是因为逃避的炭?
答案 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
答案 1 :(得分:1)
您可以减少捕获组的数量:
sed -E -i.bak "s/^(define\('HTTPS?_SERVER', 'https?:\/\/)[^']*('\);)/\1test.com\2/" file.txt