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
файл должен содержать список необходимых имен файлов/путей к файлам
$ awk '/a/{c=1} (c++)==4{print "z"} 1' file
a
b1
c1
z
d1
a
b2
c2
z
d2
Что-то вроде может работать:
awk 'BEGIN {v1=-100} {if ($1=="a") v1=FNR;if (FNR-v1==3) print "z"; print $0}' input_file
скрипт проверяет, является ли запись «a», и устанавливает переменную так, чтобы она указывала на текущую строку. Затем он проверяет, равна ли текущая строка записи минус предыдущая сохраненная строка 3 и печатает строку, затем печатает текущую строку
Для этого можно использовать скриптовый редактор 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
--записать файл обратно на диск и выйти.