grep --before-context 5
показывает 5 строк перед матчем.
Я хочу показать все перед матчем.
Делать grep --before-context 99999999
будет работать, но это не очень ... профессионально.
Как показать все файлы до матча?
text-processing
awk
sed
grep
Николас Рауль
источник
источник
sed '/PATTERN/Q' FILE
пропустит согласованную строку.Q
это расширение GNU, поэтому оно не будет работать с любым sed.sed
может заменить большую часть функциональности grep.Это означает печать с первой строки до совпадения шаблона.
Пара примеров из диапазона
источник
распечатать до и включая матч:
распечатать до НО НЕ включая матч:
источник
Q
это круто, но гну конкретный afaik,sed -n '/pattern/!p;//q'
будет более портативным.!
делаетp
применить к линиям не совпадающихpattern
, но потом//q
меня смущает ...//
означает «предыдущее регулярное выражение» (я думал, что это означает «соответствовать пустой строке»). Я думаю , что более короткий вариант того же раствора:sed -n '/pattern/q;p
?Следующие
grep
методы чистого GNU не эффективны.Поиск всего до первого экземпляра строки " foo " в файловой строке , используя три
grep
с:Соответствует до последнего экземпляра " foo ":
Примечание: подробности о последнем
grep
можно найти в: Regex (grep) для многострочного поиска .источник
grep
с (+ pcre), когда нужно просто запустить одинsed
вызов:sed 'x;/./G;//!x;/foo/p;//s/.*//;x;d'
??sed
код, кажется, стоит своего ответа, или может быть добавлен к одному из других. Re 7grep
s: Потому что не былоgrep
ответа ... (плюс, ответ помогает показать, почему нет.)Добавляя к ответу Микеля выше ...
Для того, чтобы напечатать все строки до, но не включая , первую строчку в
FILE
содержащемPATTERN
, попробуйте:sed '/.*PATTERN.*/{s///;q;}' FILE
Это соответствует всей строке, содержащей шаблон, заменяет ее пустой строкой, а затем завершает работу без обработки остальной части файла.
Пост-скрипт:
Самый простой / понятный способ предотвратить вывод дополнительной строки в конце (без использования другого инструмента) - это снова запустить sed и удалить новую заключительную строку:
... и так как мы сейчас удаляем эту строку, наша предыдущая работа избыточна, и мы можем упростить до:
источник
sed
вызова.tcsh
и вbash
псевдониме, мне нужно было убедиться, что я имел относительно сжатое однострочное решение, которое работало как в стандарте, так и в GNUsed
(для переносимости); все требования, которые ваш вклад вполне может удовлетворить. Как человек, который используетsed
очень редко, моим самым важным требованием было то, что я мог быстро понять, когда я хочу легко изменить или изменить его назначение через годы.Для людей, которые предпочитают запоминать только основные инструменты в повседневной работе и готовы принять менее изящные и менее эффективные решения:
Если эта команда предназначена для скрипта, я буду искать более элегантные (и, возможно, эффективные) решения. Если это одноразовая команда или сценарий выброса, мне все равно.
источник
Вы также можете использовать один из следующих
или же
или же
Первый вариант очень похож на предложенный OP, только он обеспечивает отображение достаточного количества строк перед контекстом путем подсчета строк в файле.
Второй вариант ищет номер строки первого совпадения (вы также можете изменить это, изменив внутреннюю «голову»), а затем использует заголовок для этого номера.
Последний параметр заменяет все новые строки соответствием, а затем заменяет два соседних совпадения новой строкой. Результатом этого является строка для каждого блока текста между двумя совпадениями. После этого он использует 'head', чтобы выбрать совпадение первой строки (отрывать блок текста до первого совпадения), а затем переводит каждое совпадение в новую строку. эта опция работает, только если файл в следующем формате
и так далее
источник
sed
команда внизу довольно грубая.