Этот сценарий должен делать это, в любом случае, с некоторыми допущениями. Например, он сломается, если атрибуты в div
теге содержит скобку закрывания ( >
), если порядок title
и creator
атрибуты изменений, или если div
тег охватывает несколько строк.
#!/usr/bin/awk -f # treat the opening tag line here /<div title=".*" creator=".*"/ { indiv = 1 # inside div from here on name = gensub(/.* title="([^"]+)".*/, "\\1", "") # extract name tagsattr = gensub(/.* tags="([^"]+)".*/, "\\1", "") # extract tags string split(tagsattr, tags, /, /) # split tags into array print(name) > name # print name into file "name" for(tag in tags) printf("@%s ", tags[tag]) >> name # print tags with "@" prefix printf("\n\n") >> name # two newlines sub(/.*<div [^>]+>/, "") # remove the tag so the rest # of the line can be printed } # treat closing line indiv == 1 && /<\/div>/ { sub(/<\/div>.*/, "") # remove tag so the rest print >> name # can be printed indiv = 0 # outside div from here on } # print all other lines inside of div indiv == 1 { print >> name }
chmod +x
это и вызов с именем входного файла в качестве аргумента. Как таковой, он создаст свой выходной файл в текущем каталоге, поэтому будьте осторожны.
Если ваши входные файлы структурированы в дереве каталогов, вам может потребоваться найти правильную командную строку с подстановочными знаками оболочки, циклами или find
утилитой.