У меня есть большая часть файла, как показано ниже:

<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 теги <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 " и т. д. ... находятся в массиве.

Есть идеи, как написать это? Я попытался с помощью sed внутри цикла while, который построчно читает файл, но это занимает очень много времени. Я попытался с awk, но я не могу получить доступ к массиву специальных символов внутри awk.

1 ответ1

0

Если частичное решение в vim приемлемо:

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

бежать \ by \/ и ~ by \~ .

\(Name\|Title\) позволяет сопоставить два шаблона и вызвать их здесь с помощью \2 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .