Bash 用sed替换多行文字

Bash 用sed替换多行文字,bash,sed,Bash,Sed,我试图替换一个多行文本,它在所有名为pom.XML的文件中都包含XML。 实际上,我需要替换此部分: <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> javax.enterprise CDIAPI 与: jakarta.enterprise jakarta.enterprise.cdi-api 我提出了以下建议: find . -name pom.xml


我试图替换一个多行文本,它在所有名为pom.XML的文件中都包含XML。 实际上,我需要替换此部分:

<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
javax.enterprise
CDIAPI
与:

jakarta.enterprise
jakarta.enterprise.cdi-api
我提出了以下建议:

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' {} + 
find-名称pom.xml-exec sed-i's/\javax\.enterprise\
\cdi api\/\jakarta\.企业版\
\雅加达\.enterprise\.cdi api\/g'{}+
但是,从输出返回“command not terminated”。 我对多行替换不太熟悉,你能推荐一些修复方法或其他工具吗?
感谢第一次测试,没有
-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' {} \;
find-名称pom.xml-exec\
sed-rz的#(javax.enterprise\n)(cdiapi)#\1jakarta.enterprise.\2#g'{};

我建议使用XML/HTML解析器(xmlstarlet,xmllint…)。除了@Cyrus所说的,您应该使用
\n
并为
sed
指定
-z
。谢谢,我已经尝试过了,但对文件没有任何影响。我尝试使用在线exp解析器,但它无法捕获第一行(
javax.enterprise
)后面的文本,即使我使用“\r”分隔行。在windows环境中,您可能有
\r\n
,因此尝试将字符串替换为
。\r\n…
find . -name pom.xml -exec \
   sed -rz 's#(<groupId>javax.enterprise</groupId>\n<artifactId>)(cdi-api</artifactId>)#\1jakarta.enterprise.\2#g' {} \;