2013-03-06 2 views
0

РЕШЕНИЕGREP SED Как я могу найти шаблон в двух строках?

Начальное решение

находку. -type f -exec sed -i ': a; N; $! ba; s/\ n // g' {} + | Grep -l "672.15687489"

Начальное сообщение:

Мне было интересно, как искать по шаблону в файле. Но в том, что шаблон натянут в две строки, и я не знаю, в какой части шаблон разделен.

Пример:

The pattern: _"672.15687489"_ 

Но, в файле может быть один из этих нескольких вариантов:

672.15\n687489 

672.156\n87489 

672.1568\n7489 

672.15687\n489 

...

Я не волнует, как дробится шаблон , единственное, что я хочу - это имя файла, у которого есть шаблон.

+1

Возможный дубликат [Как найти шаблоны в нескольких строках с помощью grep?] (Http://stackoverflow.com/questions/2686147/how-to-find-patterns-across-multiple-lines-using-grep) –

+1

Пожалуйста, опубликуйте решение как ответ на свой вопрос, а не отредактируйте вопрос. – Lundin

+0

Если файл содержит 672x15687489 (у которого есть 'x', где вы написали' .'), вы хотите увидеть имя файла? Ваш 'grep' выберет это и любую другую строку, содержащую любой другой символ вместо'. ', Поскольку точка является метасимволом. Шансы на несоответствие невелики, так что это не очень важно, но если вы действительно хотите, чтобы точка была 4-м символом, вы должны искать ее с помощью '\ .' или' [.] ' в шаблоне 'grep'. –

ответ

2

Спасибо за веселый sed | grep "solution":

sed -i ':a;N;$!ba;s/\n //g' {} + | grep -l "672.15687489" 

но на самом деле, просто используйте awk. Вот решение AWK GNU, который не изменит исходный файл, не требует несколько команд и трубы, и не требует декодер кольца Джеймс Бонд, чтобы понять тайную комбинацию букв и знаки препинания:

$ cat file 
foo 
672.15 
687489 
bar 
$ gawk -v RS='\0' '{gsub(/\n/,"")} /672.15687489/{print FILENAME; exit}' file 
file 

Все, что вам нужно знать, это то, что настройка RS на символ Null указывает gawk на то, чтобы прочитать весь файл как одну запись. Другие awks могут или не могут поддерживать это, но GNU awk. Существуют и другие awk-решения, все из которых будут более четкими, чем размещенное решение sed + grep.

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