Печать текста между регулярными выражениями - PullRequest
4 голосов
/ 12 июля 2010

Я попробовал '/pat1/,/pat2/p', но я хочу напечатать только текст между шаблонами, а не всю строку.Как мне это сделать?

Ответы [ 4 ]

4 голосов
/ 12 июля 2010

Диапазон шаблонов для многострочных шаблонов.Вот как вы это сделаете:

sed  -n '/pat1/,/pat2/{/pat1\|pat2/!p}' inputfile
  • -n - не печатать по умолчанию
  • /pat1/,/pat2/ - внутри двух шаблонов включительно
  • /pat1\|pat2/!p - напечатать все, что не является одним из шаблонов

Возможно, вы спросите, что находится между двумя шаблонами на одной линии.Один из других ответов сделает это.

Редактировать:

Несколько примеров:

$ cat file1
aaaa bbbb cccc
123 start 456
this is what
I want
789 end 000
xxxx yyyy zzzz
$ sed  -n '/start/,/end/{/start\|end/!p}' file1
this is what
I want

Вы можете сократить его, сказав sed для повторного использования самого последнего шаблона (//):

$ sed  -n '/.*start.*/,/^[0-9]\{3\} end 0*$/{//!p}' file1
this is what
I want

Как видите, мне не пришлось дублировать сложное регулярное выражение во второй части команды.

2 голосов
/ 12 июля 2010

sed -r 's/pat1(.*)pat2/\1/g' somefile.txt

0 голосов
/ 12 июля 2010

вы можете использовать awk.

$ cat file
other TEXT
pat1  text  i want pat2
pat1 TEXT I
WANT
pat2
other text
$ awk -vRS="pat2" 'RT{gsub(/.*pat1/,"");print}' file
  text  i want
 TEXT I
WANT

Решение работает для шаблонов, которые занимают несколько строк

0 голосов
/ 12 июля 2010

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

cat myfile | sed -r 's/^(.*)pat1(.*)pat2(.*)$/\2/g'
...