grep entre duas linhas com a string especificada [duplicado]

0

Eu tenho este arquivo simples (arquivo.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 formulários, o Firte cria dois novos arquivos como

newfile1.txt:

test1
abc
cvb
bnm
test2

newfile2.txt

test1
def
ijk
xyz
test2

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

newfile.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 dá um resultado como

test1abccvbbnmtest2test1abccvbbnmtest2

Eu preciso de uma linha de retorno como:

test1abccvbbnmtest2
test1abccvbbnmtest2
    
por Abderrahim 03.11.2015 / 18:18

2 respostas

1

Um onkiner para o primeiro caso:

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

que diz:

  • Se test1 for encontrado, incrementar o número do arquivo e a saída inicial (ou seja, transformar on )
  • Se ativado, imprima a linha no nome do arquivo "newfileFILE.txt", em que FILE é o número do arquivo.
  • Se test2 for encontrado, a saída final (ou seja, desligue)

Em seguida, você pode converter os dois arquivos para newfile.txt com o shell oneliner:

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

que diz "foreach file", remove todos os feeds de linha.

    
por 03.11.2015 / 19:05
0

Para sua segunda forma:

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' arquivo.txt - > capturar texto entre test1 e test2
  • xargs > newfile.txt - > transforme o texto em "linha" efetivamente falando, embora o objetivo dos xargs talvez seja diferente.
  • seds / test2 / & \ n / g 'newfile.txt - > adicionar nova linha após o padrão "test2"
  • sed-e / ^ [\ t] * // '- > excluir espaços no início de cada linha.
por 03.11.2015 / 19:58