所以我有以下有效的正则表达式,但不适用于 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
它什么也不做。
任何想法这里有什么问题?是因为转义字符吗?
由于您使用的是 POSIX ERE 语法(-r
选项),因此使用一对未转义的 (
和)
. 此外,由于您有一个'
内部模式,您需要在s/.../.../
命令周围使用双引号。
用
sed -i.bak -r "s/^(\S*HTTPS*_SERVER\S*)(\s*'https*:\/\/)(\S*)('\);)$/\1\2test.com\4/" file.txt
查看在线演示。
请注意,您可以在模式中使用除/
避免转义/
符号以外的分隔符(例如,您可以使用"s,<pattern>,<replacement>,"
, 因为模式本身中没有逗号)。Besdies,根据此线程,如果您确实需要使用单引号正则表达式定义,则可以'
将模式中的文字替换为\x27
实体。
此外,如果您不需要在 Group 1 和 Group 2 之间插入任何文本,您可以将两个组模式合并为一个,并且 - 当您删除组 3 时,您甚至不需要捕获它。
所以,另一种可能看起来像
sed -r 's,^(\S*HTTPS*_SERVER\S*\s*\x27https*://)\S*(\x27\);)$,\1test.com\2,' file.txt
请参阅另一个在线演示。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句