Como substituir uma palavra por uma nova linha

7

Eu tenho um arquivo de texto com os seguintes dados e cada linha termina com |END| .

T|somthing|something|END|T|something2|something2|END|

Estou tentando substituir |END| por \n new line por sed.

 sed 's/\|END\|/\n/g' test.txt

Mas está produzindo resultados errados, como abaixo:

 T
 |
 s
 o
 m
 e
 ...

Mas o que eu quero é isso:

T|somthing|something
T|something2|something2

Eu também tentei com tr . Não funcionou também.

    
por Sas 02.04.2015 / 18:17

6 respostas

13

Use isto:

sed 's/|END|/\n/g' test.txt

O que você tentou não funciona porque o sed usa expressões regulares básicas , e sua implementação sed tem um \| operator significa “or” (uma extensão comum para BRE), então o que você escreveu substitui (string vazia ou END ou string vazia) por uma nova linha.

    
por 02.04.2015 / 18:20
7

O seguinte funcionou bem para mim:

$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2

Note que acabei de colocar uma barra invertida seguida da tecla enter.

    
por 02.04.2015 / 18:24
5

Você pode usar awk :

$ awk -F'\|END\|' '{$1=$1}1' OFS='\n' file
T|somthing|something
T|something2|something2
  • -F'\|END\|' define o separador de campos para |END|
  • OFS='\n' definiu o separador de campos de saída para nova linha
  • $1=$1 causa awk reconstruir $0 com OFS como separador de campo
  • 1 é um valor verdadeiro, porque awk imprime toda a linha de entrada
por 02.04.2015 / 18:31
3

Outro comando possivelmente e usando sua opção RS seria :

awk '$1=$1' RS="\|END\|" file

Os registros serão impressos (com base no eparator do eparator) que não estão vazios (tem pelo menos um campo) para impedir a impressão de linhas vazias.

Testado nesta entrada:

T|somthing|something|END|T|something2|something2|END|
Test|END|
|END|

Dá esta saída:

T|somthing|something
T|something2|something2
Test

Isso apagou todas as linhas vazias :) Se você quiser ter novas linhas também, substitua $1=$1 por $0 no comando:

awk '$0' RS="\|END\|" file
    
por 02.04.2015 / 19:09
2

Outra forma com sed que não imprime linhas vazias:

sed 's/|END|/\
/g;/^$/!P;D' infile

por exemplo. entrada:

T|one|two|END|T|three|four|END|
T|five|six|END|T|seven|eight|END|
T|nine|ten|END|T|eleven|twelve|END|

saída:

T|one|two
T|three|four
T|five|six
T|seven|eight
T|nine|ten
T|eleven|twelve

mesma coisa com ed :

ed -s infile <<'IN'
1,$j
s/|END|/\
/g
,p
q
IN
    
por 02.04.2015 / 22:43
0

Eu tive um problema semelhante no shell estrito do posix Eu fiz isso em dois passos com um char não utilizado

cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'
    
por 08.09.2017 / 15:54