bash: отфильтровать последовательные строки из текстового файла

Я хочу удалить из многих файлов каждый экземпляр абзаца. Я называю абзацем последовательность строк.

Например:

my first line
my second line
my third line
the fourth
5th and last

the problem is that I only want to delete them when they appear as a group. For example, if

my first line
appears alone I don't want to delete it.


person flybywire    schedule 10.03.2010    source источник


Ответы (3)


Если вы умеете использовать Perl, вы можете сделать это одной строкой:

perl -0777 -pe 's/my first line\nmy second line\nmy third line\nthe fourth\n5th and last\n//g' paragraph_file

объяснение находится в perlrun:

Специальное значение 00 заставит Perl поглощать файлы в режиме абзаца. Значение 0777 заставит Perl глотать файлы целиком, потому что с таким значением нет допустимого байта.

Пример ввода:

my first line
my second line
my third line
the fourth
5th and last
hey
my first line
my second line
my third line
the fourth
5th and last

hello
my first line

Выход:

$ perl -0777 -pe 's/my first line\nmy second line\nmy third line
\nthe fourth\n5th and last\n//g' paragraph_file
hey

hello
my first line
person ire_and_curses    schedule 10.03.2010

@OP, я вижу, вы приняли ответ, согласно которому ваши предложения в абзацах «жестко связаны», поэтому я предполагаю, что эти абзацы всегда одинаковы? это правда, вы можете использовать grep. Сохраните абзац, от которого вы хотите избавиться, в файле, например, «фильтр», затем используйте опции -f и -v команды grep, чтобы выполнить задание,

grep -v -f filter file
person ghostdog74    schedule 10.03.2010

Вы можете сделать это с помощью sed:

sed '$!N; /^\(.*\)\n\1$/!P; D' file_to_filter
person David V.    schedule 10.03.2010
comment
как это используется? где указать фильтр? - person flybywire; 10.03.2010
comment
Если ваш файл называется file_to_filter, то эта команда в ответе выведет ваш файл с удаленными повторяющимися строками. - person David V.; 10.03.2010