Использование 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
Вам нужно всего лишь запустить это выражение.