split pcregrep многострочные совпадения - PullRequest
0 голосов
/ 07 мая 2018

tl; dr: Как разделить каждое многострочное совпадение с помощью pcregrep?

длинная версия: у меня есть файлы, в которых некоторые строки начинаются с символа (нижнего регистра), а некоторые начинаются с цифры или специального символа. Если у меня есть по крайней мере две строки рядом, начинающиеся со строчной буквы, я хочу, чтобы это было в моих выходных данных. Тем не менее, я хочу, чтобы каждый вывод был разделен / разделен, а не добавлен друг к другу. Это регулярное выражение:

pcregrep -M "([a-z][^\n]*\n){2,}"

Итак, если я дам файл, подобный этому:

-- Header -- 
info1 
info2 
something 
< not interesting > 
dont need this 
+ new section 
additional 1 
additional 2 

Результат:

info1 
info2
something 
additional 1
additional 2 

Тем не менее, я хочу вот что:

info1 
info2 
something 

additional 1
additional 2

Возможно ли это и / или я должен начать использовать Python (или аналогичный)? Даже если с этого момента рекомендуется использовать что-то еще, было бы неплохо узнать, возможно ли это в первую очередь.

Спасибо!

1 Ответ

0 голосов
/ 07 мая 2018

Следующая sed, кажется, добивается цели:

sed -n '/^[a-z]/N;/^[a-z].*\n[a-z]/{p;:l n;/^[a-z]/{p;bl};a\

}'

Объяснение:

/^[a-z]/{           # if a line starts with a LC letter
  N;                   # consume the next line while conserving the previous one
  /^[a-z].*\n[a-z]/{   # test whether the second line also starts with a LC letter
    p;                   # print the two lines of the buffer
    l: n;                # define a label "l", and reads a new line
    /^[a-z]/{            # if the new line still starts with a LC letter
      p;                   # print it
      bl                   # jump back to label "l"
    }
    a\
                         # append a new line after every group of success 
  }
}

Пробный прогон :

$ echo '-- Header --
> info1
> info2
> something
> < not interesting >
> dont need this
> + new section
> additional 1
> additional 2 ' | sed -n '/^[a-z]/N;/^[a-z].*\n[a-z]/{p;:l n;/^[a-z]/{p;bl};a\
>
> }'
info1
info2
something

additional 1
additional 2
 
...