Получить n-й диапазон по шаблону - PullRequest
0 голосов
/ 16 февраля 2011

Мой ввод такой:

start
content A
end
garbage
start
content B
end

Я хочу извлечь второй (или первый, или третий ...) start .. end блок.С

sed -ne '/start/,/end/p'

я могу отфильтровать мусор, но как мне получить просто «начало содержимого B end»?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Но в любом случае, если вам нужен sed - вы получаете sed:)

/^start$/{
  x
  s/^/a/
  /^aaa$/{
    x
    :loop
    p
    /^end$/q
    n
    bloop
  }
  x
}

Число «а» в среднем матче равно тому, какой сегмент вы хотите получить.Вы могли бы также иметь это в повторении регулярных выражений, как отметил Деннис.Этот подход позволяет указать прямой номер для скрипта.

Примечание: скрипт должен запускаться с опцией -n sed.

1 голос
/ 16 февраля 2011

Получить весь диапазон

$ awk 'BEGIN{RS="end";FS="start"}{ print $NF}' file

content A


content B

Получить 2-й диапазон

$ awk 'BEGIN{RS="end";FS="start"}{c++; if (c==2) print $NF}' file

content B

Рубин (1,9+), получить первый диапазон

$ ruby -0777 -ne 'puts $_.scan(/start(.*?)end/m)[0]' file

content A
...