Этот сценарий должен делать это, в любом случае, с некоторыми допущениями. Например, он сломается, если атрибуты в теге 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
it и вызов с именем входного файла в качестве аргумента. Как таковой, он создаст свой выходной файл в текущем каталоге, поэтому будьте осторожны.
Если ваши входные файлы структурированы в дереве каталогов, вам может потребоваться найти правильную командную строку с подстановочными знаками оболочки, циклами или утилитой find
.