У меня есть сценарий, в который я помещаю полезные советы, которые позволяют мне напоминать себе о различных вещах, которые я часто забываю. В настоящее время это выглядит так (но с более полезными советами):
#!/bin/bash
awk 'BEGIN{IGNORECASE = 1}/^.*'$1'.*:$/,/^$/' <<'_EOF'
tip_header:
tip1:
actual tip
<-- white space to here
tip2:
another tip
<-- white space to here
something:
else with \weird $characters^~
another_header:
tip1:
tip1 for another_header
_EOF
Затем я вызываю tips tip_header
, чтобы распечатать все между tip_header:
и пустой строкой до another_header:
(строкой до tip2:
имеет пробел, поэтому не является пустым) или tips tip1
для печати из каждой строки tip1:
до следующей пустой строки.
Я хотел бы изменить выражение awk, чтобы endpat
соответствует первой пустой строке с тем же отступом, что и в begpat
, поэтому при вызове tips tip1
также не выводится tip2
. Что-то вроде:
awk 'BEGIN{IGNORECASE = 1}/^([[:blank:]]*).*'$1'.*:$/,/^\1$/' <<'_EOF'
, но это не работает (я не уверен, как / если можно использовать обратные ссылки в awk или их вариантах). Я не против переключения awk с чем-то еще, что может выполнять многострочное сопоставление с шаблоном.
Редактировать: текущий результат работы tips tip1
равен
brett@brett:~/tmp$ ./tips tip1
tip1:
actual tip
tip2:
another tip
something:
else with \weird $characters^~
tip1:
tip1 for another_header
Желаемый результат равен
brett@brett:~/tmp$ ./tips tip1
tip1:
actual tip
tip1:
tip1 for another_header
при сохранении
brett@brett:~/tmp$ ./tips tip_header
tip_header:
tip1:
actual tip
tip2:
another tip
something:
else with \weird $characters^~