Мне нужно найти определенную строку в обратном порядке и распечатать ее.
В приведенном ниже примере я хочу выполнить поиск по шаблону 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
perl -00 -ne 'print if /not in order/' file
Опция -00 считывает файл по абзацам. [F3] добавляет неявный цикл по всем параграфам файла. Затем напечатайте абзац, если он содержит нужный текст «не в порядке».
Используя 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
другой подход:
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;}
Если блоки должны заканчиваться строкой, содержащей 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
It может показаться запутанным, чтобы найти строку, а затем найти ее снова, чтобы пропустить ее, но мы не можем использовать пустую строку вместо этого, или sed включит свой флаг работы здесь в следующей пустой строке и продолжит работу до следующей is in order, который слишком сильно удалит.
perl -00 -ne 'print if /not in order/' file
Опция -00 считывает файл по абзацам. [F3] добавляет неявный цикл по всем параграфам файла. Затем напечатайте абзац, если он содержит нужный текст «не в порядке».
Используя 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
другой подход:
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;}
Если блоки должны заканчиваться строкой, содержащей 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
It может показаться запутанным, чтобы найти строку, а затем найти ее снова, чтобы пропустить ее, но мы не можем использовать пустую строку вместо этого, или sed включит свой флаг работы здесь в следующей пустой строке и продолжит работу до следующей is in order, который слишком сильно удалит.