Awk: вставить строку после N строк по шаблону

to identify and write all xml file names which are empty to a text file for reporting purpose

find+xmlstarletраствор:

find. -type f -name "*.xml" -exec bash -c \
'v=$(xmlstarlet sel -t -i "count(//*)=1 and //*[1][not(normalize-space())]" -o 1 -b $1);
[[ -n "$v" ]] && echo "$1" >> "empty_xml.txt"' _ {} \;

empty_xml.txtфайл должен содержать список необходимых имен файлов/путей к файлам

0
06.02.2020, 12:47
4 ответа
$ awk '/a/{c=1} (c++)==4{print "z"} 1' file
a
b1
c1
z
d1


a
b2
c2
z
d2
1
28.04.2021, 23:24

Что-то вроде может работать:

awk 'BEGIN {v1=-100} {if ($1=="a") v1=FNR;if (FNR-v1==3) print "z"; print $0}' input_file

скрипт проверяет, является ли запись «a», и устанавливает переменную так, чтобы она указывала на текущую строку. Затем он проверяет, равна ли текущая строка записи минус предыдущая сохраненная строка 3 и печатает строку, затем печатает текущую строку

1
28.04.2021, 23:24

илиsedвставить/добавить:

sed '/^a/{n;n;n;i\z
}' FILE
sed '/^a/{n;n;a\z
}' FILE
1
28.04.2021, 23:24

Для этого можно использовать скриптовый редактор ed:глобально вставить zтри строки после сопоставления/a/:

$ ed -s input-file
g/a/+3i\
z
wq

или одной строкой:

printf '%s\n' 'g/a/+3i\' 'z' 'wq' | ed -s input-file

Команды ed— это:

  • g/a/+3i\--глобально выполнить последующую команду, которая :через три строки после совпадения /a/, вставить некоторый текст. Обратная косая черта в конце продолжает команду вставки на следующую строку.
  • z--вставьте текст z. При отсутствии завершающей обратной косой черты команда вставки завершается, завершая глобальное выполнение.
  • wq--записать файл обратно на диск и выйти.
1
28.04.2021, 23:24

Теги

Похожие вопросы