Есть несколько способов решить эту проблему:
sed / \ r \? $ / A / 'file_list.txt
awk' {print $ 0 "A"} 'RS = "\ r * \ n \ r *" file_list.txt
awk -F' \ r '' {print $ 1 "A"} 'file_list.txt
Наконец-то получил широкое распространение:
tr -d '\r' <file_list.txt | do_what_ever_want
Я запускаю приведенную выше команду и работает отлично,
awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}'
блоки с разделителями пустые,это работает отлично.
Это может сработать:
$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt
Мы определяем dn:
как разделитель записей. Поля в одной записи разделяются символом новой строки \n
.
Если у вас есть две строки после строки, начинающейся с dn:
, до того, как новая запись начнется с dn:
, у вас будет 3 раза "\n", ведущих к 4 полям в записи. Вот почему мы проверяем, есть ли в записи более 3 полей (NF>3
). Если это так, мы распечатываем всю запись, но должны добавить dn:
.
Обратите внимание, что NF>3
найдет все записи с более чем двумя следующими строками в одной записи. Если вы хотите, чтобы только те, у кого ровно два, измените его на NF==3
.
Если блоки разделены пустой строкой (, как показано в одном из ваших более поздних комментариев ), используйте вместо этого:
$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt