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.
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.
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.
no awk:
awk '
$1 == "secondmatch" {print_me = 0}
print_me {print}
$1 == "firstmatch {print_me = 1}
'
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
Tags text-processing sed