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?

WildBill
fonte
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
Prince John Wesley
fonte
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.

Walter Mundt
fonte
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.

Max Nanasy
fonte
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
nar8789
fonte
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
Chris Seymour
fonte
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 '...

Ramon Rey
fonte
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

Cnetwork
fonte
7

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

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
ryenus
fonte
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)

user2300875
fonte
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

t3az0r
fonte
2
$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

Funciona para mim no Mojave

Paulo Henrique Lellis Gonalves
fonte
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.

DawnSong
fonte
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
Jeff LaFay
fonte