Использование sed для соответствия шаблону и удаления из строки в конец файла

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

Следующее выражение позволяет мне удалить в начало потока, включая сопоставленный шаблон:

sed -e '1,/Files:/d'

Учитывая некоторые примеры данных:

Blah blah blah
Foobar foo foo
Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

-----THIS STUFF IS USELESS-----
BLEH BLEH BLEH
BLEH BLEH BLEH

Выполнение вышеуказанного выражения дает:

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

-----THIS STUFF IS USELESS-----
BLEH BLEH BLEH
BLEH BLEH BLEH

Я хотел бы добиться подобного эффекта, но в противоположном направлении. Используя вывод из предыдущего выражения, я хочу удалить из -----THIS STUFF IS USELESS----- в конец файла включительно. Он должен произвести (после прохождения первого выражения):

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

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

Фактический текст можно найти здесь: http://pastebin.com/CYBbJ3qr Обратите внимание на изменение от -----THIS STUFF IS USELESS----- до -----BEGIN PGP SIGNATURE-----.

Ответ 1

почему не

 sed '/^-----THIS STUFF IS USELESS-----$/,$d' file

В выражении диапазона, которое вы использовали, ', $' будет указывать "до конца файла"

1 is first line in file, 
$ is last line in file.

Выход

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

IHTH

Ответ 2

Вместо того, чтобы пытаться понять, как выразить то, чего вы не хотите, просто напечатайте то, что вам нужно:

awk -v RS= '/Files:/' file

EDIT: с учетом вашего измененного ввода:

awk '/^Files:$/{f=1} f; /^$/{f=0}' file

или

awk '/^Files:$/{f=1} f; /^-----THIS STUFF IS USELESS-----$/{f=0}' file

если вы предпочитаете.

Вы также можете использовать любой из них:

awk '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file
sed '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file

но их трудно продлить позже.

Ответ 3

sed -e '/^-----THIS STUFF IS USELESS-----$/,$ d'

Ответ 4

Грязный полезный нож grep версия:

cat your_output.txt | grep -B 99999999 "THIS STUFF IS USELESS" | grep -v "THIS STUFF IS USELESS"

Ответ 5

Здесь регулярное выражение, которое, я думаю, сделает то, что вы хотите: ^(?:(?!Files:).)+|\s*-----THIS STUFF IS USELESS-----.+ Обязательно установите флаг dotall.

Демо + объяснение: http://regex101.com/r/xF2fN5

Вам нужно всего лишь запустить это выражение.