Как напечатать определенные строки из разделов файла, разделенных пустой строкой с помощью sed - PullRequest
1 голос
/ 25 октября 2019

Я пытался придумать команду sed, которая будет вытягивать определенные строки из блоков текста, разделенных пустой строкой в ​​файле. Текстовые блоки, как показано ниже.

# cat test_file.txt
line 1
line 2
line 3
line 4
line 5

line 1 
line 2
line 3
line 4
line 5

line 1 
line 2
line 3
line 4
line 5

Я пытаюсь извлечь строки 2 и 4 из каждого блока, чтобы вывод был таким, как показано ниже.

line 2
line 4

line 2
line 4

line 2 
line 4

Я пришелс помощью способа сделать это для первого блока текста с помощью sed:

# sed -n -e 2p -e 4p test_flie.txt
line 2
line 4

Но не удалось найти способ заставить его продолжить для каждого блока текста до конца файла,Любые указатели будут с благодарностью.

Ответы [ 3 ]

1 голос
/ 26 октября 2019
Режим абзаца

awks существует специально для обработки записей / блоков текста, разделенных пробелами, с которыми вы имеете дело:

$ awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} {print $2, $4}' file
line 2
line 4

line 2
line 4

line 2
line 4

Ссылка стандарт POSIX :

Если RS равно нулю, то записи разделяются последовательностями, состоящими из <newline> плюс одна или несколько пустых строк, начальные или конечные пустые строки не должны приводить к пустым записям в начале или конце ввода

Если вам не нужно печатать пустую строку после окончательной записи:

$ awk 'BEGIN{RS=""; FS=OFS="\n"} NR>1{print prev ORS} {prev=$2 OFS $4} END{print prev}' file
line 2
line 4

line 2
line 4

line 2
line 4

или если по какой-то причине вы не хотите использовать режим абзаца:

$ awk 'BEGIN{tgts[2]; tgts[4]} !NF{print ""; lineNr=0; next} ++lineNr in tgts' file
line 2
line 4

line 2
line 4

line 2
line 4
0 голосов
/ 26 октября 2019

Это может работать для вас (GNU sed):

sed -n '/\S/{n;p;n;n;p;:a;n;//ba;p}' file

Установите параметр -n для явной печати. Напечатайте вторую и четвертую строки, затем отбросьте все непустые строки и напечатайте первую пустую. Повторение.

0 голосов
/ 25 октября 2019

Я бы использовал для этого awk, например:

awk '(!NF&&m=NR)||NR-m==2||NR-m==4' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...