bash: отфильтровывать последовательные строки из текстового файла - PullRequest
1 голос
/ 10 марта 2010

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

Например:

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

проблема в том, что я хочу удалить их, только когда они появляются как группа. Например, если

my first line
появляется один, я не хочу его удалять.

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

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

grep -v -f filter file
1 голос
/ 10 марта 2010

Если вы можете использовать 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
0 голосов
/ 10 марта 2010

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

sed '$!N; /^\(.*\)\n\1$/!P; D' file_to_filter
...