首页 > 解决方案 > 用 sed 替换多行文本

问题描述


我正在尝试替换所有名为 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' {} + 

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

标签: bashsed

解决方案


首先-i在没有一个文件的文件夹中进行测试。
较新版本的 GNUsed支持该选项-z

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

推荐阅读