У меня есть файл с содержимым, как показано ниже:
<root>
<appender name="abc">
some lines
</appender>
<appender name="def">
some lines
</appender>
<appender name="qaz">
some lines
</appender>
</root>
Я хочу прокомментировать ниже:
<!--
<appender name="def">
some lines
</appender>-->
Что такое
sed -i '/<appender name="def"/s/^/<--/;/<\/appender>/s/$/-->/' file.xml
Это добавляет <!--
поверх <appender name="def">
но -->
добавляется во все строки, где присутствует </appender>
. Я хочу добавить -->
только на </appender>
которые получают поиск после первого совпадения.
Результат должен быть следующим:
<root>
<appender name="abc">
some lines
</appender>
<!--
<appender name="def">
some lines
</appender>-->
<appender name="qaz">
some lines
</appender>
</root>
Я пробовал искать партии для подобных проблем, но не смог найти их.
Ответ на dibery выглядит великолепно, но поскольку вы также отметили python, я предоставил простой скрипт, который сделает вашу работу.
with open("file.xml", "r") as r:
lines = r.readlines()
gotcha = False # Just a flag to know if we catched the field
with open("file.xml", "w") as w:
for k in range(len(lines)):
if '<appender name="def">' in lines[k]:
w.write("<!--\n")
gotcha = True # We got it!
w.write(lines[k])
if '</appender>' in lines[k] and gotcha:
w.write('-->\n')
gotcha = False # We have done our job, this avoids commenting every other '</appender>' field
Выход
<root>
<appender name="abc">
some lines
</appender>
<!--
<appender name="def">
some lines
</appender>
-->
<appender name="qaz">
some lines
</appender>
</root>
Сохраните следующий process.awk
/<appender name="def">/ {
show = 1
print "<!--"
}
/<\/appender>/ {
if( show == 1 )
{
$0 = $0 "-->"
show = 0
}
}
{
print
}
и использовать
awk -f process.awk file.xml
Объяснение:
Для онлайн-отображения скрипт awk записывается в отдельный файл. Если вы предпочитаете, вы можете легко преобразовать его в встроенную версию.