我有一个大文件,其中一部分如下所示:
<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
这里调用它们。