баш:отфильтровать последовательные строки из текстового файла
-
19-09-2019 - |
Вопрос
Я хочу удалить из многих файлов каждый экземпляр параграф.Я называю абзац последовательностью строк.
Например:
my first line my second line my third line the fourth 5th and last
проблема в том, что я хочу удалять их только тогда, когда они появляются как группа.Например, если
my first lineпоявляется один, я не хочу его удалять.
Решение
Если вы умеете использовать 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
Другие советы
@OP, я вижу, вы приняли ответ, согласно которому ваши абзацы «жестко закреплены», поэтому я предполагаю, что эти абзацы всегда одинаковы?это правда, ты можешь использовать grep
.Сохраните абзац, от которого хотите избавиться, в файле, например «фильтр», затем используйте -f
и -v
опция grep для выполнения работы,
grep -v -f filter file
Вы можете сделать это с помощью sed:
sed '$!N; /^\(.*\)\n\1$/!P; D' file_to_filter