Vou enviar um formulário usando cURL, onde parte do conteúdo vem de outro arquivo, selecionado usando sed
Se o param1
padrão de correspondência de linha de outro arquivo estiver 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 2 padrões correspondentes, excluindo o padrão correspondente.
Vamos dizer que file.txt
contém:
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, muitos sed
comandos "entre 2 padrões correspondentes" não serão removidos 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.
text-processing
sed
lokomika
fonte
fonte
Respostas:
Aqui está uma maneira de fazer isso:
Explicou: A partir da primeira linha para a linha correspondente firstmatch , excluir. Da linha que corresponde à segunda correspondência até a última linha, exclua.
fonte
No awk:
fonte
A outra
sed
solução falhará sefirstmatch
ocorrer na 1ª linha 1 .Mantenha a simplicidade, use um intervalo único e um regex 2 vazio :
imprima tudo nesse intervalo, exceto as extremidades do intervalo (impressão automática desativada) 3 :
ou, mais curto, exclua tudo que não estiver nesse intervalo e também exclua o término do intervalo:
1: A razão é que, se o segundo endereço for uma regexp, a verificação da correspondência final começará com a linha que segue a linha que corresponde ao primeiro endereço .
Portanto,
/firstmatch/
nunca é avaliado para a 1ª linha da entrada,sed
simplesmente a exclui, pois corresponde ao número da linha1,/RE/
e passa para a 2ª linha, onde verifica se a linha corresponde/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) tivesse sido especificado.3: a
;}
sintaxe é parased
implementações modernas ; com os mais velhos, use uma nova linha em vez do ponto-e-vírgula ou expressões separadas, por exemplosed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile
fonte
//
está fazendo (dentro da{…}
)?//
significa a última expressão regular usada; de tudo o que li, deveria ser/secondmatch/
. Eu verifiquei através de testes que seu comando funciona e, portanto, concluí que ele está funcionando como/firstmatch|secondmatch/
(que você confirmou), mas não consigo encontrar nenhuma documentação (nem mesmo o documento POSIX ao qual você vinculou ou o GNU manual sed ) que descreve esse comportamento. … (Continua)sed
: (1) Se sim/first/,4
, então//
age como/first/
. (2) Se sim2,/second/
,//
obtém um erro "sem expressão regular anterior". (Acho isso uma falha flagrante em seguir o comportamento especificado.) (3) A adição--posix
não muda nenhuma das opções acima. (II) Em outros programas: (4) Emvi
, depois/first/,/second/
,//
age como/second/
(e as outras formas também são implementações racionais da regra documentada). … (Continua)awk
parece não ter noção do “último ER usado”;//
refere-se ao não caractere antes ou depois de qualquer caractere. (Convido você a tentarecho -- | awk '{ gsub(//, "cha"); print }'
.)/first|second/
. Sortudo. Menciono os outros programas para demonstrar que essa não é uma convenção regex em todo o sistema. Quem quer que o tenha adicionadosed
não se preocupou em adicioná-lovim
, onde teria feito quase tanto sentido. :-)