Substituir vírgula por nova linha no sed no MacOS?


286

Eu tenho um arquivo de identificação que são separados por vírgula. Estou tentando substituir as vírgulas por uma nova linha. Eu tentei:

sed 's/,/\n/g' file

Mas isto não está funcionando. o que estou perdendo?


12
tente tr , '\n'. Eu acho que o sed trata \ncomo texto simples.
Prince John Wesley

1
Isso funcionou! arquivo de gato | tr, '\ n'
WildBill

7
tr , '\n' < file- sem cachimbo.
Prince John Wesley

Para que serve o gfinal do script? Eu recebo o mesmo comportamento sem ele.
HelloGoodbye

Qual shell você está usando? Isso funciona para mim, usando o shell bash.
HelloGoodbye

Respostas:


361

Use em trvez disso:

tr , '\n' < file

eu estava procurando substituir '.' período, e esta foi a solução que estou procurando :)
Jonah

1
Não está funcionando no shell bash $ tr, '\ n' uso do aitr: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
Aluno

5
Substituir uma vírgula por um ponto-e-vírgula também funciona:tr ',' ';' < input.csv > output.csv
Wim Deblauwe

304

Use uma seqüência de caracteres citada ANSI-C $'string'

Você precisa de uma nova linha literal com escape de barra invertida para chegar ao sed. No bash pelo menos,$'' strings serão substituídas \npor uma nova linha real, mas você precisará dobrar a barra invertida que o sed verá para escapar da nova linha, por exemplo,

echo "a,b" | sed -e $'s/,/\\\n/g'

Observe que isso não funcionará em todas as conchas , mas funcionará nas mais comuns.


5
estranho, ele também funciona com uma barra invertida a menos, ou seja echo "a,b" | sed -e $'s/,/\\n/g.
Alexandre Holden Daly

2
Votado. Para mais informações, consulte a seção "CITAÇÕES" de man bash.
precisa saber é o seguinte

7
Tenho que trabalhar com OSX 10.11: sed -E $'s/<\\/br>/\\\n/g' file, há necessidade de instalar gnu-sed
Brice

2
Trabalho verificado no OS X 10.7 com o exemplo fornecido. A -eparte parece não ser necessária.
Yongwei Wu

1
exemplo, em resposta imediatamente funciona para mim em OSX 10.11.5
Jurriaan Roelofs

122
sed 's/,/\
/g'

funciona no Mac OS X.


3
Obrigado por isso - Gostaria de saber por que meu antigo truque do Linux não funcionou no OSX. Mas isso faz!
Wyatt8740

6
Essa é a única solução que funciona em um script sed.
Firstrock

6
Note que a barra invertida escapa a nova linha literal (de modo que não é um terminador de comando): é não um caractere de continuação (como no bash, etc.). Para ver a diferença, tente escrever o comando acima sem as aspas: a barra invertida será interpretada pelo shell como um caractere de continuação de linha e ela e a nova linha serão descartadas. Por outro lado, inclua o conteúdo da expressão entre aspas (sem aspas) em um arquivo separado por vírgula para newline.sed (que elimina a sintaxe do shell) e funciona!
Nils von Barth

1
isso é bom, pois pode substituir qualquer coisa, não um personagem. tr parece funcionar apenas com caracteres. se você colocar uma string como primeiro parâmetro, ela substituirá toda a ocorrência dos caracteres, não a string.
Shawn

1
@Droogans Você está usando o bash, sh ou um shell diferente? Tem certeza de que está usando aspas simples em vez de aspas duplas?
precisa saber é o seguinte

22

Se o uso sed tende a ser inteiramente expressões de substituição (como o meu tende a ser), você também pode usar perl -peem vez

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz

15

Aparentemente \ré a chave!

$ sed 's/, /\r/g' file3.txt > file4.txt

Transformado isso:

ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS

Para isso:

ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS

Eu sei que a pergunta diz OS X, mas isso não funciona com o GNU sed-4.2.2-6.fc20.x86_64.
Cristian Ciupitu

10
Lembre-se de que \rnão é o mesmo \ne isso pode interromper a manipulação e o uso de dados.
Joel Purra

3
Desculpe, isso não funcionou para mim. Acabei de receber um 'r' onde deveria haver uma nova linha.
Frank de Groot - Schouten

Você deve deixar mais claro na resposta que isso dá \r!
pir

Funcionou para mim, mas eu me pergunto o porquê! \ n é o padrão no UNIX stackoverflow.com/questions/1761051/difference-between-n-and-r
Alex

15

Isso funciona no MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) e RHE Linux (versão 5.3 do Red Hat Enterprise Linux Server, Tikanga) ...

$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt

... onde isso ^Jé feito com ctrl+ v+ j. Importe-se com o \antes do^J .

PS, eu sei que o sed no RHEL é GNU, o MacOS sed é baseado no FreeBSD e, embora não tenha certeza sobre o Solaris sed, acredito que isso funcionará praticamente com qualquer sed. YMMV tho '...


12

MacOS é diferente, há duas maneiras de resolver este problema com sed no mac

  • primeiro, use \'$'\n''replace \n, ele pode funcionar no MacOS:

    sed 's/,/\'$'\n''/g' file
    
  • o segundo, basta usar uma linha vazia:

    sed 's/,/\
    /g' file
    
  • Ps. Preste atenção ao intervalo separado por '

  • o terceiro, use gnu-sed substitua o mac-sed


7

Para torná-lo completo, isso também funciona:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"

1
Este também seria apropriado para o concurso Obfuscated C, exceto que é Bash;)
Aaron R.

@AaronR. Concordo :-). Certamente eu prefiro a trsolução, que já é a resposta aceita.
Ryenus

1
Isso funcionou no OS X. Por que, em \n\rvez de \r\n? Eu tentei \r\nqual é a ordem necessária no Windows. No entanto, depois de fazer isso, está deixando muito^M caracteres de retorno carro vim, então acho que deve ser apenas, \nmas \nsozinho não funciona.
NobleUplift

4

Embora eu esteja atrasado para este post, atualizei minhas descobertas. Esta resposta é apenas para o Mac OS X.

$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern

No comando acima, tentei com Shift + Enter adicionar uma nova linha que não funcionou. Portanto, desta vez tentei "escapar" da "nova linha sem escape", conforme informado pelo erro.

$ sed 's/new/\
> /g' m1.json > m2.json 

Trabalhou! (no Mac OS X 10.9.3)


Isso não é diferente da resposta de Max Nanasy, dois anos antes da sua.
Miken32

2

Apenas para esclarecer: a página de manual do sed no OSX (10.8; Darwin Kernel Versão 12.4.0) diz:

[...]

Sed Expressões regulares

 The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
 (modern) regular expressions can be used instead if the -E flag is given.  In addition, sed has the following two additions to regular
 expressions:

 1.   In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
      Also, putting a backslash character before the delimiting character causes the character to be treated literally.  For example, in the
      context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
      ``abcxdef''.

 2.   The escape sequence \n matches a newline character embedded in the pattern space.  You cannot, however, use a literal newline charac-
      ter in an address or in the substitute command.

[...]

então eu acho que é preciso usar tr - como mencionado acima - ou o bacana

sed "s/,/^M
/g"

note: você deve digitar < ctrl> -v, < return> para obter '^ M' no editor vi



1

sedno macOS Mojave foi lançado em 2005, então uma solução é instalar o gnu-sed,

brew install gnu-sed

então use gsedfará o que você desejar,

gsed 's/,/\n/g' file

Se preferir sed, apenas sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', o que é sugerido por brew info gnu-sed. Reinicie seu termo, então você está sedna linha de comando gsed.


0

FWIW, a seguinte linha funciona no Windows e substitui ponto-e-vírgula nas variáveis ​​do meu caminho por uma nova linha. Estou usando as ferramentas instaladas no meu diretório git bin.

echo %path% | sed -e $'s/;/\\n/g' | less
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.