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
test1
encontrado, aumente o número do arquivo e inicie a saída (ou seja, turnon
) - Se ativado, imprime linha no nome do arquivo "newfileFILE.txt", onde FILE é o número do arquivo.
- Se
test2
for encontrado, finalize a saída (ou seja, desligue)
Então, você pode converter os dois arquivos newfile.txt
com 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.