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|
com \n
nova linha com 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
. Também não funcionou.
Respostas:
Usa isto:
O que você tentou não funciona porque o sed usa expressões regulares básicas e sua implementação sed possui um
\|
operador que significa “ou” (uma extensão comum ao BRE); portanto, o que você escreveu substitui (stringEND
vazia ou string vazia) por uma nova linha.fonte
\n
). A pergunta pergunta como substituir|END|
por uma nova linha, não por\n
.O seguinte funcionou bem para mim:
Observe que eu apenas coloquei uma barra invertida seguida pela tecla Enter.
fonte
\n
como na resposta da @ AB não funcionaria com algumassed
implementações.\|
alternância em uma regexp, mas não\n
significa nova linha em umas
substituição?Você pode usar
awk
:-F'\\|END\\|'
defina o separador de campos para|END|
OFS='\n'
definir separador de campo de saída como nova linha$1=$1
causarawk
reconstruir$0
comOFS
como separador de campo1
é um valor verdadeiro, porqueawk
imprime toda a linha de entradafonte
Outro possivelmente awkcomando e usando sua
RS
opção seria:Imprimirá os registros (com base no do awk R ecord S eparator), que não estão vazias (tem pelo menos um campo) para evitar a impressão de linhas vazias.
Testado nesta entrada:
Dá esta saída:
Isso limpou todas as linhas vazias :) Se você quiser ter novas linhas também, substitua
$1=$1
por$0
no comando:fonte
$1=$1
condensa seqüências de espaços em branco em um caractere de espaço e retorna false se o primeiro campo for 0. Não faz sentido. Você provavelmente querawk 1 RS='\\|END\\|'
ouawk NF RS='\\|END\\|'
ouawk length RS='\\|END\\|'
aqui. Note-se que um regexp RS requer gawk ou mawkOutra maneira com
sed
isso não imprime linhas vazias:por exemplo, entrada:
resultado:
mesma coisa com
ed
:fonte
Como mencionado aqui por Walter Mundt , podemos conseguir isso usando uma string citada ANSI C
Confira o link acima aqui para outras alternativas.
Você também pode usar a seguinte sintaxe, não tenho certeza se funciona em todos os tipos de Unix / Linux
fonte
Eu tive um mesmo problema no shell estrito posix eu fiz isso em duas passagens com um char não utilizado
fonte