Поиск между двумя шаблонами и печать данных из первого шаблона во второй шаблон несколько раз, исключая несогласованные блоки

Мне нужно найти определенную строку в обратном порядке и распечатать ее.

В приведенном ниже примере я хочу выполнить поиск по шаблону not in order до шаблона number of.

Пример: входной файл содержит:

number of characters a[1] reg1 reg2 reg3 info a[1] is not in order number of characters a[3] reg1 reg2 reg3 info a[3] is in order number of characters a[2] reg1 reg2 reg3 info a[2] is not in order

должен быть:

number of characters a[1] reg1 reg2 reg3 info a[1] is not in order number of characters a[2] reg1 reg2 reg3 info a[2] is not in order
4
задан 23 August 2017 в 12:14

8 ответов

perl -00 -ne 'print if /not in order/' file

Опция -00 считывает файл по абзацам. [F3] добавляет неявный цикл по всем параграфам файла. Затем напечатайте абзац, если он содержит нужный текст «не в порядке».

2
ответ дан 18 July 2018 в 08:04

Используя in order с новой строкой в ​​качестве разделителя абзаца, мы можем сделать:

awk -v RS='in order\n' '/not/{print $0 "in order"}'

awk рассматривает текст, разделенный шаблоном в RS (разделитель записи) в качестве записей, и каждая операция выполняется по записи. Таким образом, /not/ проверяет, соответствует ли запись not, а затем мы печатаем запись ($0) вместе с текстом разделителя, который был удален awk.

Итак:

$ mawk -v RS='in order\n' '/not/{print $0 "in order"}' foo number of characters a[1] reg1 reg2 reg3 info a[1] is not in order number of characters a[2] reg1 reg2 reg3 info a[2] is not in order
4
ответ дан 18 July 2018 в 08:04

другой подход:

tac file | awk ' BEGIN {weprint=0 ; rem="not necessary, but for clarity"} /is not in order$/ { weprint=1 ;} ( weprint == 1) { print $0 ; rem="same remark here..."; } /^number of/ { weprint=0 ;} ' | tac

, который при необходимости может быть сокращен ...

Если вы хотите разделительную линию: измените последнюю строку как

"/^number of/" { print ; weprint=0;}
3
ответ дан 18 July 2018 в 08:04

Если блоки должны заканчиваться строкой, содержащей is in order или is not in order, мы можем удалить вещи между ними ...

$ sed '/is not in order/,/is in order/ {/is not in order/n;d}' file number of characters a[1] reg1 reg2 reg3 info a[1] is not in order number of characters a[2] reg1 reg2 reg3 info a[2] is not in order

Примечания:

/is not in order/,/is in order/ найти строки между is not in order и is in order, включительно {some commands} группой, эти команды /is not in order/n пропустить строку с этим шаблоном из следующей команды d удалить указанные строки

It может показаться запутанным, чтобы найти строку, а затем найти ее снова, чтобы пропустить ее, но мы не можем использовать пустую строку вместо этого, или sed включит свой флаг работы здесь в следующей пустой строке и продолжит работу до следующей is in order, который слишком сильно удалит.

3
ответ дан 18 July 2018 в 08:04
perl -00 -ne 'print if /not in order/' file

Опция -00 считывает файл по абзацам. [F3] добавляет неявный цикл по всем параграфам файла. Затем напечатайте абзац, если он содержит нужный текст «не в порядке».

2
ответ дан 24 July 2018 в 18:58

Используя in order с новой строкой в ​​качестве разделителя абзаца, мы можем сделать:

awk -v RS='in order\n' '/not/{print $0 "in order"}'

awk рассматривает текст, разделенный шаблоном в RS (разделитель записи) в качестве записей, и каждая операция выполняется по записи. Таким образом, /not/ проверяет, соответствует ли запись not, а затем мы печатаем запись ($0) вместе с текстом разделителя, который был удален awk.

Итак:

$ mawk -v RS='in order\n' '/not/{print $0 "in order"}' foo number of characters a[1] reg1 reg2 reg3 info a[1] is not in order number of characters a[2] reg1 reg2 reg3 info a[2] is not in order
4
ответ дан 24 July 2018 в 18:58
  • 1
    не можем ли мы использовать только шаблон "не в порядке" пока шаблон "количество" потому что я вижу, что часть абзаца находится между – Bhargavi Bk 23 August 2017 в 11:53
  • 2
    Покажите нам образец текста, для которого это происходит. – muru 23 August 2017 в 11:56
  • 3
    Предупреждающая информация количество символов a [1] reg1 reg2 reg3 info a [1] не соответствует порядку количества символов a [3] reg1 reg2 reg3 info a [3] соответствует порядковому числу символов a [2] reg1 reg2 reg3 info a [2] не в порядке количества символов a [4] reg1 reg2 reg3 info a [4] в порядке helperflop – Bhargavi Bk 23 August 2017 в 12:10
  • 4
    вы должны проверить на / is not$/ (т. е. «не является» как конец строки), чтобы быть более безопасным при согласовании границ – Olivier Dulac 23 August 2017 в 12:30
  • 5
    @OlivierDulac хорошая идея, но в этом случае я думаю, что проблема больше в дополнительном тексте в строках (я вижу helperflop в комментариях выше, но без форматирования я не могу разобраться, где он принадлежит) – muru 23 August 2017 в 12:32

другой подход:

tac file | awk ' BEGIN {weprint=0 ; rem="not necessary, but for clarity"} /is not in order$/ { weprint=1 ;} ( weprint == 1) { print $0 ; rem="same remark here..."; } /^number of/ { weprint=0 ;} ' | tac

, который при необходимости может быть сокращен ...

Если вы хотите разделительную линию: измените последнюю строку как

"/^number of/" { print ; weprint=0;}
3
ответ дан 24 July 2018 в 18:58

Если блоки должны заканчиваться строкой, содержащей is in order или is not in order, мы можем удалить вещи между ними ...

$ sed '/is not in order/,/is in order/ {/is not in order/n;d}' file number of characters a[1] reg1 reg2 reg3 info a[1] is not in order number of characters a[2] reg1 reg2 reg3 info a[2] is not in order

Примечания:

/is not in order/,/is in order/ найти строки между is not in order и is in order, включительно {some commands} группой, эти команды /is not in order/n пропустить строку с этим шаблоном из следующей команды d удалить указанные строки

It может показаться запутанным, чтобы найти строку, а затем найти ее снова, чтобы пропустить ее, но мы не можем использовать пустую строку вместо этого, или sed включит свой флаг работы здесь в следующей пустой строке и продолжит работу до следующей is in order, который слишком сильно удалит.

3
ответ дан 24 July 2018 в 18:58

Другие вопросы по тегам:

Похожие вопросы: