XML 文本转换

XML 文本转换

我有一个大文件,其中一部分如下所示:

<DataGroup xsi:type="ReportDataGroup">
<SmartReportTemplate DescriptionContentType="text/plain"
IsActive="true">
<Name ns1:translate="yes">Agent Summary</Name>
<Defaults type="defaults">
<Title ns1:translate="yes">Agent Summary Report</Title>
<Description ns1:translate="yes"></Description>

现在我需要检查模式.*ns1:translate="yes">(.*)</.* ,找到后我需要从此行下方的数组中添加字符串。除了数组中的字符串之外,如果上面的行有,我还需要添加标签<Name xml:lang="ja"></Name>数组中的字符串 obt 周围,如果模式匹配的行有</Name>,则需要添加<Title xml:lang="ja">和 标签</Title></Title>

最终输出应如下所示:

<DataGroup xsi:type="ReportDataGroup">
<SmartReportTemplate DescriptionContentType="text/plain"
IsActive="true">
<Name ns1:translate="yes">EM - perc</Name>
<Name xml:lang="ja">\u886815wEM - perce ~~~~~~~~~ ~~~~~~~~~ ~~\u5834</Name>
<Defaults type="defaults">
<Title ns1:translate="yes">AG - Rep</Title>
<Title xml:lang="ja">\u886815wAG - Rep ~~~~~~~~~ ~~~~~~~~~ ~~\u5834</Title>
<Description ns1:translate="yes"></Description>

其中字符串“ \u886815wEM - perce ~~~~~~~~~ ~~~~~~~~~ ~~\u5834”等位于数组中。

知道如何编写脚本吗?我尝试在 while 循环中使用 sed 逐行读取文件,但这需要很长时间。我尝试使用 awk,但无法访问 awk 中的特殊字符数组。

答案1

如果部分解决方案vim是可以接受的:

:%s/\(.*\(Name\|Title\).*ns1:translate="yes">.*<\/.*\)/<\2 xml:lang="ja">\\u886815wEM - perce \~\~\~\~\~\~\~\~\~ \~\~\~\~\~\~\~\~\~ \~\~\\u5834<\/\2>\r\1/g

\渐渐\/地逃走~\~.

\(Name\|Title\)允许匹配两个模式并在\2这里调用它们。

相关内容