grep entre duas linhas com string especificada

grep entre duas linhas com string especificada

Eu tenho este arquivo plat simples (file.txt)

a43
test1
abc
cvb
bnm
test2
test1
def
ijk
xyz
test2
kfo

Eu preciso de todas as linhas entre test1 e test2 em dois formatos, o primeiro cria dois novos arquivos como

novoarquivo1.txt:

test1
abc
cvb
bnm
test2

novoarquivo2.txt

test1
def
ijk
xyz
test2

e o segundo formulário cria apenas um novo arquivo como:

novo arquivo.txt

test1abccvbbnmtest2
test1abccvbbnmtest2

Você tem alguma proposta?

Para o segundo formulário. Eu usei isso

sed -n '/test1/,/test2/p' file.txt > newfile.txt

Mas isso me deu um resultado como

test1abccvbbnmtest2test1abccvbbnmtest2

Eu preciso de uma linha de retorno como:

test1abccvbbnmtest2
test1abccvbbnmtest2

Responder1

Um oneliner awk para o primeiro caso:

awk '/^test1/{file++; on=1} on{print >("newfile" file ".txt")} /^test2/{on=0}' file.txt

que diz:

  • Se test1encontrado, aumente o número do arquivo e inicie a saída (ou seja, turn on)
  • Se ativado, imprime linha no nome do arquivo "newfileFILE.txt", onde FILE é o número do arquivo.
  • Se test2for encontrado, finalize a saída (ou seja, desligue)

Então, você pode converter os dois arquivos newfile.txtcom o shell oneliner:

for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt

que diz, foreach arquivo, remova todos os feeds de linha.

Responder2

Para o seu segundo formulário:

sed -n '/test1/,/test2/p' file.txt | xargs > newfile.txt ; sed 's/test2/&\n/g' newfile.txt | sed -e 's/^[ \t]*//'
  • sed -n '/test1/,/test2/p' file.txt -> capturar texto entre test1 e test2
  • xargs > newfile.txt -> transformar texto em "linha", efetivamente falando, embora o propósito de xargs talvez seja diferente.
  • sed 's/test2/&\n/g' newfile.txt -> adicionar nova linha após o padrão "test2"
  • sed -e 's/^[ \t]*//' --> exclui espaços no início de cada linha.

informação relacionada