【问题标题】:Replace multiline text wtih sed用 sed 替换多行文本
【发布时间】:2020-02-27 20:45:49
【问题描述】:


我正在尝试替换所有名为 pom.xml 的文件中包含 XML 的多行文本。 在实践中,我需要替换这部分:

<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>

与:

<groupId>jakarta.enterprise</groupId>
<artifactId>jakarta.enterprise.cdi-api</artifactId>

我想出了以下 sed:

find . -name pom.xml -exec sed -i 's/\<groupId\>javax\.enterprise\<\/groupId\>
      \<artifactId\>cdi-api\<\/artifactId\>/\<groupId\>jakarta\.enterprise\<\/groupId\>
        \<artifactId\>jakarta\.enterprise\.cdi-api\<\/artifactId\>/g' {} + 

但是,从输出中返回“命令未终止”。 我对多行替换不太熟悉,你能建议任何修复或其他工具吗? 谢谢

【问题讨论】:

  • Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
  • 除了@Cyrus 所说的,您应该使用\n 并为sed 指定-z,而不是使用文字换行符。

标签: bash sed


【解决方案1】:

第一次在没有-i 的情况下在一个文件的文件夹中进行测试。
较新版本的 GNU sed 支持选项 -z

find . -name pom.xml -exec \
   sed -rz 's#(<groupId>javax.enterprise</groupId>\n<artifactId>)(cdi-api</artifactId>)#\1jakarta.enterprise.\2#g' {} \;

【讨论】:

  • 谢谢,我试过了,但对文件没有任何影响。我正在尝试使用在线 exp 解析器,但它无法捕获第一行 (&lt;groupId&gt;javax.enterprise&lt;/groupId&gt;) 之后的文本,即使我使用了“\r”来分隔行
  • windows环境下可能有\r\n,所以尝试用...&lt;/groupId&gt;\r\n&lt;artifactId&gt;...替换字符串
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 2022-08-13
  • 2010-11-16
  • 1970-01-01
相关资源
最近更新 更多