Imprima linhas entre (e excluindo) dois padrões

11

Vou enviar o formulário usando cURL, em que parte do conteúdo é proveniente de outro arquivo, selecionado usando sed

Se param1 for um padrão de correspondência de linha de outro arquivo usando sed , o comando abaixo funcionará bem:

curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit

Agora, vá para o problema. Quero mostrar apenas texto entre dois padrões de correspondência, excluindo o próprio padrão de correspondência.

Digamos que file.txt contenha:

Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.

Atualmente, o comando "entre dois padrões de correspondência" sed não remove firstmatch e secondmatch .

Eu quero que o resultado se torne:

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
    
por lokomika 26.07.2011 / 06:02

3 respostas

13

Aqui está uma maneira de fazer isso:

sed '1,/firstmatch/d;/secondmatch/,$d' 

Explicação: Da primeira linha até a linha correspondente a firstmatch , exclua. Da linha correspondente a secondmatch até a última linha, exclua.

    
por 26.07.2011 / 07:07
4

no awk:

awk '
  $1 == "secondmatch" {print_me = 0}
  print_me {print}
  $1 == "firstmatch {print_me = 1}
'
    
por 26.07.2011 / 12:43
0

A outra solução sed falhará se firstmatch ocorrer na primeira linha 1 .

Mantenha-o simples, use um intervalo único e um regex vazio 2 :
imprima tudo nesse intervalo excluindo o limite de término (impressão automática desativada) 3 :

sed -n '/firstmatch/,/secondmatch/{//!p;}' infile

ou, mais curto, exclua tudo que não estiver nesse intervalo e exclua o intervalo:

sed '/firstmatch/,/secondmatch/!d;//d' infile

1: O motivo é que se o segundo endereço for um regexp, a verificação da correspondência final será iniciada com a linha seguinte à linha que correspondeu ao primeiro endereço .
Portanto, /firstmatch/ nunca é avaliado para a 1ª linha da entrada, sed simplesmente a excluirá, pois corresponde ao número da linha em 1,/RE/ e passa para a segunda linha, onde verifica se a linha corresponde a /firstpattern/

2: Quando um REGEX está vazio (ou seja // ) sed se comporta como se o último REGEX usado no último comando aplicado (como um endereço ou como parte de um comando substituto) fosse especificado.

3: a sintaxe ;} é para implementações sed modernas; com os mais antigos, use uma nova linha em vez do ponto-e-vírgula ou expressões separadas, por ex. sed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile

    
por 14.03.2018 / 12:44