2013-04-19 3 views
3

У меня есть длинный текстовый файл в ascii. Каждый так часто он будет иметь Page: ##### в строке. Я хотел бы совместить начало с «Страница: 25141» и каждую строку после этого до конца документа.Grep - используя get «Match» до конца текстового файла. * Не работает

Некоторые из комбо я попытался это:

grep -E ^["Page: 25141".*] document.txt 
grep "Page: 25141.*" document.txt 
grep "Page: 25141\.\*" document.txt 
grep -E "Page: 25141"[.*] document.txt 
grep -E "Page: 25141"{.*} document.txt 
grep -E {"Page: 25141".*} document.txt 

Не удается получить эту работу.

ответ

6

Если СЭД решения хорошо для вас:

sed -n '/Page: 25141/,$p' file 

выше СЭД будет соответствовать всем линиям между диапазоном, начиная от линии содержащий шаблон «Страница 25141», до конца файла ($).

+0

Это будет сделано. Как узнать, как это происходит при использовании grep. * До конца документа. – dman

+0

. * - это регулярное выражение, которое мы используем для соответствия шаблону внутри строки. ваше требование не для линии, ее до конца файла .. – Guru

3

Поскольку grep ориентирован на линию, сопоставляя несколько строк с регулярным выражением, это непросто. Тем не менее, вариант -A будет печатать контекст после любых матчей:

grep -A 1000000000 'Page: 25141' 

Вы также можете сделать это с ed или sed:

echo '/Page: 25141/,$p' | ed -s filename 

я почти получил его на работу с .*, на основе nenopera's answer к аналогичный вопрос. Единственная проблема заключается в том, что она печатает дополнительный символ новой строки в конце:

grep -Pzo '(?s)Page: 25141.*' 
+0

ya, подумал об этом ... но я хотел сделать это более эффективно. * – dman

0

Вы можете подумать об awk, который предназначен для таких рабочих мест. awk 'BEGIN{i=0;} /pattern/ {i=1;} {if(i==1) print}' file будет работать хорошо, и если вы хотите сделать больше.

Смежные вопросы