如何从现代编辑器正则表达式转换为sed
语法?
经验丰富的开发人员,但完全是sed
菜鸟,谢谢您的关注。
- 使用 Pop OS Linux 20.04 LTS
- 我在 VS Code 中“烹饪”我的正则表达式,因为它会在您键入模式时实时匹配,非常方便!
- 尝试在我的 Dockerfile 中编辑 XML
sed
。 - 我在 VS Code 中有模式匹配,但我似乎无法找到正确的
sed
命令语法。 - 用 3 种不同的方式重写了我的正则表达式,消除过程不起作用。找不到我在这里缺少的概念/语法。
XML之前
<!-- HTTP Connector from upstream proxy -->
<Connector executor="tomcatConnectorThreadPool" port="8081" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="3000" enableLookups="false" redirectPort="443" URIEncoding="UTF-8" bindOnInit="false"
scheme="http" proxyPort="80" />
XML 之后(我要追求的)
<!-- HTTP Connector from upstream proxy -->Hello World
我的正则表达式适用于 VS Code
搜索模式
(<!-- HTTP Connector from upstream proxy -->)(^.*)(^.*)(^.*)
替换模式
VS Code 反向引用 =$1
$1Hello World
sed
失败
猜猜为什么这些不起作用。
有点毛茸茸的正则表达式,无法解释特殊字符?
sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)([<.\w="\-\s\/>]*$)/\1Hello World/g' path/to/xml.xml
子子引用不合法?
sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)((^.*\n){3})/\1Hello World/g' path/to/xml.xml
不知道为什么这不起作用?
sed -E 's/(<!-- HTTP Connector from upstream proxy -->)\n(^.*)\n(^.*)\n(^.*)/\1Hello World/g' path/to/xml.xml
如何将这些正则表达式表达为正确的sed
命令语法?
答案1
问题是您似乎试图跨多个换行符进行匹配。你的正则表达式:
(<!-- HTTP Connector from upstream proxy -->)(^.*)(^.*)(^.*)
这在我所知道的任何正则表达式风格中都不起作用。您的 VSCode 工具似乎使用正则表达式风格,其中多个^
隐式意味着“跨换行符匹配”。大多数 *nix 实用程序都处理由尾随\n
字符定义的“记录”(行)。您需要一些技巧来让它们在多行中匹配。
由于您使用的是 Linux,这意味着您有 GNU sed
,您可以这样做:
$ sed -Ez 's/^(<!-- HTTP Connector from upstream proxy -->)\n([^\n]*\n){3}/\1Hello World\n/' file.xml
<!-- HTTP Connector from upstream proxy -->Hello World
或者,就您而言,更短:
$ sed -Ez 's/^(<!--[^\n]*)\n([^\n]*\n){3}/\1Hello World\n/' file.xml
<!-- HTTP Connector from upstream proxy -->Hello World
这里的技巧是,-z
它会sed
读取整个文件并将其视为一个“记录”。然后,我们告诉它<!--
在记录的开头找到 a并将其捕获为\1
(您需要括号来捕获组),然后匹配最长的非换行符,直到出现换行符 ( [^\n]*\n
),然后再匹配三行(行表示非换行符后跟换行符: ([^\n]*\n){3}
)。
对于此任务,我根本不会使用正则表达式,只需使用行号:
$ sed '1s/$/Hello world!/; 2d;3d;4d' file.xml
<!-- HTTP Connector from upstream proxy -->Hello world!