1

У меня есть текстовый файл, который выглядит примерно так:

*FILESTART
line_a
line_b
line_c
*INCLUDE
file_A.key
file_B.key
*INCLUDE
file_1.key
file_2.key
file_3.key
*SOMETHING_ELSE
line_x
line_y
line_z
*END

Я хотел бы напечатать только строки между каждым оператором * INCLUDE и любым следующим оператором звездочки, в этом случае следующее:

file_A.key
file_B.key
file_1.key
file_2.key
file_3.key

Количество файлов .key может варьироваться, и имена не всегда заканчиваются на .key.

Код для этого будет реализован в существующем скрипте bash, поэтому он должен быть основан на awk, sed или чем-то еще в "стиле bash", а не на Perl, PHP, Python и т.д.

Я пробовал такие вещи, как

sed -n '/^*INCLUDE/,/^\*/p' 

но он печатает только первый раздел и заканчивается второй строкой * INCLUDE.

Какие-либо предложения?

2 ответа2

2

В этом случае sed не работает, потому что вторые *INCLUDE повороты диапазона паттерна, и он никогда не включается снова. Я думаю, что это было бы проще с awk , например, вы можете использовать флаг печати, например так:

awk '/^\*/ { f=0 } /^\*INCLUDE/ { f=1; next } f' file

Выход:

file_A.key
file_B.key
file_1.key
file_2.key
file_3.key

объяснение

  • Когда f==1 последний оператор (т. Е. Единственный f) вызывает правило по умолчанию {print $0} .
  • f устанавливается в 0 всякий раз, когда строка начинается со звездочки.
  • f устанавливается в 1 всякий раз, когда строка начинается с *INCLUDE . Эти строки также пропускаются согласно требованию.
0

Я использовал скрипт Rexx, чтобы делать подобные вещи. По сути, вы используете скрипт для «включения или выключения эха» в зависимости от наличия * include to * end ...

Немного ясного программирования позволит вам записать вывод в память и запустить его как пакетный файл с подпрограммами и подстановкой строк. Это, по сути, характер программы weave дона Кнута. Вы пишете документацию и программу в одном файле, а затем извлекаете программу в качестве вывода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .