\ n imprime um n em vez de uma nova linha ao usar sed no MaxOSX

6

É um problema geral quando uso sed , mas \n funciona quando o uso fora de sed . Este é um exemplo do que recebo com sed .

Eu tenho o arquivo myfile com o seguinte conteúdo:

1 2 3 4 5

Quando eu uso isso:

sed 's/ /\n/g' myfile

Eu entendo isso:

1n2n3n4n5

Em vez de conseguir isso:

1
2
3
4
5

Alguém sabe onde está o problema?

    
por Charlie 07.06.2014 / 18:45

2 respostas

6

Você está usando OSX 10.8 , então seu sed implement é FreeBSD sed , não GNU sed . Portanto, FreeBSD sed não interpreta \n como nova linha.

Você pode tentar:

$ sed 's/ /\'$'\n/g' myfile

$'\n/g' faz com que bash interprete a cadeia como uma expansão de escape padrão, por isso \n é convertido para nova linha antes de sed process.

ou usando tr em vez de sed :

$ tr -s ' ' '\n' < myfile
    
por 07.06.2014 / 19:18
3

O Gnouc está certo sobre a causa, mas a forma portátil de especificar um \n no lado direito de uma instrução s/// é:

s//\
/

Mas você também pode inserir G et a \n ewline no final de seu espaço de padrão a partir de um espaço em branco como:

G

E você pode usar portably o operador y translate com o \n no lado direito também. Então o seu ...

sed 's/ /\n/g' myfile

... faria o que você esperava se fosse escrito como ...

sed 'y/ /\n/' myfile

... com a vantagem adicional de que provavelmente também seria um pouco minúsculo mais rápido. Embora a solução tr do Gnouc provavelmente seja muito mais rápida ainda.

    
por 07.06.2014 / 19:21

Tags