Sostituisci la virgola con newline in sed su MacOS?


287

Ho un file di ID separati da virgola. Sto cercando di sostituire le virgole con una nuova riga. Ho provato:

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

ma non sta funzionando. Cosa mi sto perdendo?


12
provare tr , '\n'. Immagino che sed tratti \ncome un semplice testo.
Prince John Wesley,

1
Ha funzionato! file cat | tr, '\ n'
WildBill

7
tr , '\n' < file- nessuna pipa.
Prince John Wesley,

A cosa serve la gfine della sceneggiatura? Ho lo stesso comportamento senza di essa.
Ciao Arrivederci,

Che shell stai usando? Questo funziona per me, usando la shell bash.
Ciao Arrivederci,

Risposte:


362

Usa trinvece:

tr , '\n' < file

stavo cercando di sostituire "." periodo, e questa era la soluzione che sto cercando :)
Giona

1
Non sta funzionando nella bash shell $ tr, '\ n' aitr use: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
Studente

5
Sostituire una virgola con un punto e virgola funziona anche:tr ',' ';' < input.csv > output.csv
Wim Deblauwe,

304

Utilizzare una stringa tra virgolette ANSI-C $'string'

Hai bisogno di una newline letterale con escape backslash per arrivare a sed. Almeno in bash, le $''stringhe sostituiranno \ncon una nuova riga reale, ma poi dovrai raddoppiare la barra rovesciata che sed vedrà per sfuggire alla nuova riga, ad es.

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

Nota che questo non funzionerà su tutte le shell , ma funzionerà su quelle più comuni.


5
strano, funziona anche con una barra in meno cioè echo "a,b" | sed -e $'s/,/\\n/g.
Alexandre Holden Daly,

2
Upvoted. Per maggiori informazioni consultare la sezione "PREVENTIVO" di man bash.
tboyce12,

7
Funzionato con OSX 10.11:, sed -E $'s/<\\/br>/\\\n/g' filenon è necessario installare gnu-sed
Brice,

2
Lavoro verificato su OS X 10.7 con l'esempio fornito. La -eparte non sembra necessaria.
Yongwei Wu,

1
esempio in risposta funziona immediatamente per me in OSX 10.11.5
Jurriaan Roelofs

122
sed 's/,/\
/g'

funziona su Mac OS X.


3
Grazie per questo - Mi chiedevo perché il mio vecchio trucco di Linux non funzionasse in OSX. Ma questo fa!
Wyatt8740,

6
Questa è l'unica soluzione che funziona in uno script sed.
Firstrock,

6
Si noti che la barra inversa sfugge la nuova riga letterale (in modo che non è una terminazione di comando): esso è non un carattere di continuazione (come in bash, ecc). Per vedere la differenza, prova a scrivere il comando precedente senza le virgolette: la barra rovesciata verrà invece interpretata dalla shell come un carattere di continuazione della riga e la nuova riga verrà scartata. Al contrario, includi il contenuto dell'espressione tra virgolette (senza virgolette) in un file separato da virgola a newline.sed (che elimina la sintassi della shell) e funziona!
Nils von Barth,

1
questo è buono poiché può sostituire qualsiasi cosa, non un personaggio. tr sembra funzionare solo con personaggi. se inserisci una stringa come primo parametro, sostituirà tutte le occorrenze dei caratteri, non la stringa.
Shawn

1
@Droogans Stai usando bash, sh o una shell diversa? Sei sicuro di utilizzare virgolette singole anziché doppie?
Max Nanasy,

22

Se il tuo uso sed tende ad essere interamente espressioni di sostituzione (come il mio tende ad essere), puoi anche usare perl -peinvece

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

15

Apparentemente \rè la chiave!

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

Trasformato questo:

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

A questa:

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

So che la domanda dice OS X, ma questo non funziona con GNU sed-4.2.2-6.fc20.x86_64.
Cristian Ciupitu,

10
Tieni presente che \rnon è lo stesso di \ne ciò potrebbe interrompere ulteriori manipolazioni e utilizzo dei dati.
Joel Purra,

3
Mi dispiace, questo non ha funzionato per me. Ho appena ricevuto una 'r' dove dovrebbe esserci una nuova riga.
Frank de Groot - Schouten,

Dovresti renderlo più chiaro nella risposta che questo dà \r!
pir

Ha funzionato per me ma mi chiedo perché! \ n è lo standard su unix stackoverflow.com/questions/1761051/difference-between-n-and-r
Alex

15

Funziona su MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) e RHE Linux (Red Hat Enterprise Linux Server versione 5.3, Tikanga) ...

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

... dove ^Jviene fatto facendo ctrl+ v+ j. Ricorda il \prima il ^J.

PS, so che il sed in RHEL è GNU, il macOS sed è basato su FreeBSD, e anche se non sono sicuro del Solaris sed, credo che funzionerà praticamente con qualsiasi sed. YMMV tho '...


12

MacOS è diverso, ci sono due modi per risolvere questo problema con sed in mac

  • per prima cosa, usa \'$'\n''sostituisci \n, può funzionare in MacOS:

    sed 's/,/\'$'\n''/g' file
    
  • il secondo, basta usare una riga vuota:

    sed 's/,/\
    /g' file
    
  • Ps. Prestare attenzione all'intervallo separato da '

  • il terzo, usa gnu-sed per sostituire il mac-sed


7

Per completarlo, funziona anche:

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

1
Questo sarebbe anche adatto per il contest di C offuscata, tranne che per Bash;)
Aaron R.

@AaronR. Sono d'accordo :-). Sicuramente preferisco la trsoluzione, che è già la risposta accettata.
reno

1
Questo ha funzionato su OS X. Perché \n\rinvece di \r\n? Ho provato \r\nqual è l'ordine necessario su Windows. Tuttavia, dopo averlo fatto, lasciano molti ^Mpersonaggi di ritorno in carrozza vim, quindi penso che dovrebbe essere solo \nma \nda solo non funziona.
NobleUplift,

4

Anche se sono in ritardo in questo post, sto solo aggiornando le mie scoperte. Questa risposta è solo per Mac OS X.

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

Nel comando sopra ho provato con Shift + Invio per aggiungere una nuova riga che non ha funzionato. Quindi questa volta ho provato a "sfuggire" alla "nuova riga senza caratteri di escape", come indicato dall'errore.

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

Lavorato! (in Mac OS X 10.9.3)


Questo non è diverso dalla risposta di Max Nanasy due anni prima della tua.
miken32,

2

Giusto per chiarire: man-page di sed su OSX (10.8; Darwin Kernel Versione 12.4.0) dice:

[...]

Espressioni regolari di Sed

 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.

[...]

quindi immagino che si debba usare tr - come menzionato sopra - o il nifty

sed "s/,/^M
/g"

nota: devi digitare < ctrl> -v, < return> per ottenere '^ M' nell'editor vi



1

sedsu macOS Mojave è stato rilasciato nel 2005, quindi una soluzione è installare il gnu-sed,

brew install gnu-sed

quindi usare gsedfarà come desideri,

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

Se preferisci sed, solo sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', che è suggerito da brew info gnu-sed. Riavvia il termine, quindi la sedriga di comando è gsed.


0

FWIW, la seguente riga funziona in Windows e sostituisce i punti e virgola nelle variabili del mio percorso con una nuova riga. Sto usando gli strumenti installati nella mia directory git bin.

echo %path% | sed -e $'s/;/\\n/g' | less
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.