Извлечение текста между строками - PullRequest
0 голосов
/ 20 августа 2010

Как извлечь текст между строками с очень специфическим шаблоном из файла, заполненного этими строками?Пример:

input:a_log.gz:make=BMW&year=2000&owner=Peter

Я хочу по существу захватить часть make=BMW&year=2000.Я точно знаю, что строка может начинаться как «input: (любое количество символов) .gz:» и заканчиваться на «owner = Peter»

Ответы [ 5 ]

0 голосов
/ 20 августа 2010

Я не видел ответа, используя awk:

awk '{ match($0, /input:.*\.gz:/);
       m = RSTART+RLENGTH;
       n = index($0, "&owner=Peter") - m;
       print substr($0,m,n)
     }'

Этот метод является своего рода смесью между версией sh (подстрока по расширениям параметров) и sed (обычныйвыражения) версии.Это потому, что awk RE не имеют обратных ссылок.

0 голосов
/ 20 августа 2010
>echo "input:a_log.gz:make=BMW&year=2000&owner=Peter"|sed -e "s/input:.*.gz://g" -e "s/&owner.*//g"
make=BMW&year=2000
0 голосов
/ 20 августа 2010

Попробуйте:

sed -n 's/.*:\([^&]*&[^&]*\)&.*/\1/p' file

Это извлечет все, что находится между вторым двоеточием и вторым амперсандом, независимо от того, что находится до и после (если имеется больше двоеточий или амперсандов, оно может работать неправильно).

0 голосов
/ 20 августа 2010

вы можете использовать оболочку (bash / ksh)

$ s="input:a_log.gz:make=BMW&year=2000&owner=Peter"
$ s=${s##*gz:}
$ echo ${s%%owner=Peter*}
make=BMW&year=2000&

если хочешь sed

$ echo ${s} | sed 's/input.*gz://;s/owner=Peter//'
make=BMW&year=2000&
0 голосов
/ 20 августа 2010

Используйте регулярное выражение: input:.*?\.gz:(.*?)&?owner=Peter.Захват будет содержать вещи между вторым двоеточием и "owner = Peter", обрезая амперсанд.

...