Substituir novas linhas por sed (a la tr) [duplicado]

1
echo "hi,my,name,is" | sed 's/,/\n/g' >out.txt

rendimentos:

hi
my
name
is

Mas ao contrário:

sed 's/\n/,/g' out.txt

rendimentos:

hi
my
name
is

Por que o sed não reverte a operação com uma inversão da operação de substituição?

    
por alexei.net 09.03.2018 / 02:18

2 respostas

5

Tente:

$ sed 'H;1h;$!d;x; s/\n/,/g' out.txt
hi,my,name,is

Por padrão, o sed lê apenas uma linha por vez, processa e imprime. Como uma única linha nunca possui um caractere de nova linha, o comando s/\n/,/g não faz nada. A solução, como acima, é ler o arquivo inteiro de uma só vez e, em seguida, fazer s/\n/,/g .

Os comandos H;1h;$!d;x leem o arquivo inteiro de uma só vez. É provavel É mais simples pensar nisso como uma expressão idiomática. Se você realmente quer saber os detalhes sangrentos:

  • H - Anexa linha atual para manter espaço
  • 1h - Se esta for a primeira linha, sobrescreva o espaço de espera com isso
  • $!d - Se esta não for a última linha, exclua o espaço do padrão e pule para a próxima linha.
  • x - Espaço de troca e padrão para colocar o arquivo inteiro em espaço padrão

Alternativa: awk

$ awk 'NR>1{printf ","} {printf "%s",$0} END{print""}' out.txt
hi,my,name,is

Ou:

$ awk '{printf "%s%s",(NR==1?"":","),$0} END{print""}' out.txt
hi,my,name,is
    
por 09.03.2018 / 02:21
1

Com o gnu sed

echo "hi,my,name,is" | sed 's/,/\n/g' | sed -z 's/\n/,/g'
    
por 09.03.2018 / 18:51

Tags