如何从现代编辑器正则表达式转换为sed语法?

如何从现代编辑器正则表达式转换为sed语法?

如何从现代编辑器正则表达式转换为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失败

猜猜为什么这些不起作用。

  1. 有点毛茸茸的正则表达式,无法解释特殊字符?

    sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)([<.\w="\-\s\/>]*$)/\1Hello World/g' path/to/xml.xml
    
  2. 子子引用不合法?

    sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)((^.*\n){3})/\1Hello World/g' path/to/xml.xml
    
  3. 不知道为什么这不起作用?

    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!

相关内容