Komma durch Zeilenumbruch in sed unter MacOS ersetzen?

286

Ich habe eine Datei mit IDs, die durch Kommas getrennt sind. Ich versuche, die Kommas durch eine neue Zeile zu ersetzen. Ich habe es versucht:

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

aber es funktioniert nicht. Was vermisse ich?

WildBill
quelle
12
versuche es tr , '\n'. Ich denke, sed behandelt \nals einfachen Text.
Prinz John Wesley
1
Das hat funktioniert! Katzendatei | tr, '\ n'
WildBill
7
tr , '\n' < file- kein Rohr.
Prinz John Wesley
Wofür steht das gam Ende des Skripts? Ich bekomme das gleiche Verhalten ohne es.
Hallo Auf Wiedersehen
Welche Shell benutzt du? Dies funktioniert bei mir mit der Bash-Shell.
Hallo Auf Wiedersehen

Antworten:

361

Verwenden Sie trstattdessen:

tr , '\n' < file
Prinz John Wesley
quelle
Ich suchte nach Ersatz '.' Punkt, und das war die Lösung, die ich suche :)
Jonah
1
Es ist wokring nicht in $ tr Bash - Shell '\ n' AITR Nutzung: tr [-Ccsu] string1 string2 tr [-Ccu] -d Zeichenfolge1 tr [-Ccu] -s Zeichenfolge1 tr [-Ccu] -ds string1 string2
Lerner
5
Das Ersetzen eines Kommas durch ein Semikolon funktioniert auch:tr ',' ';' < input.csv > output.csv
Wim Deblauwe
304

Verwenden Sie eine ANSI-C-Zeichenfolge in Anführungszeichen $'string'

Sie benötigen eine Backslash-entkommene wörtliche Newline, um zu sed zu gelangen. Zumindest in Bash werden $''Strings durch \neine echte Newline ersetzt, aber dann müssen Sie den Backslash verdoppeln, den sed sieht, um der Newline zu entkommen, z

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

Beachten Sie, dass dies nicht bei allen Shells funktioniert , sondern bei den gängigsten.

Walter Mundt
quelle
5
seltsam, es funktioniert auch mit einem Backslash weniger dh echo "a,b" | sed -e $'s/,/\\n/g.
Alexandre Holden Daly
2
Upvoted. Weitere Informationen finden Sie im Abschnitt "ANGEBOT" von man bash.
tboyce12
7
Habe es mit OSX 10.11 sed -E $'s/<\\/br>/\\\n/g' filezum
Brice
2
Verifizierte Arbeit unter OS X 10.7 mit dem angegebenen Beispiel. Der -eTeil scheint nicht notwendig.
Yongwei Wu
1
Beispiel als Antwort funktioniert sofort für mich in OSX 10.11.5
Jurriaan Roelofs
122
sed 's/,/\
/g'

funktioniert unter Mac OS X.

Max Nanasy
quelle
3
Danke dafür - Ich habe mich gefragt, warum mein alter Linux-Trick unter OSX nicht funktioniert hat. Aber das tut es!
Wyatt8740
6
Dies ist die einzige Lösung, die in einem sed-Skript funktioniert.
Firstrock
6
Beachten Sie, dass der Backslash dem wörtlichen Zeilenumbruch entgeht (damit es sich nicht um einen Befehlsterminator handelt): Es handelt sich nicht um ein Zeilenfortsetzungszeichen (wie in Bash usw.). Um den Unterschied zu erkennen, versuchen Sie, den obigen Befehl ohne Anführungszeichen zu schreiben: Der Backslash wird stattdessen von der Shell als Zeilenfortsetzungszeichen interpretiert und er und die neue Zeile werden verworfen. Fügen Sie umgekehrt den Inhalt des in Anführungszeichen gesetzten Ausdrucks (ohne Anführungszeichen) in eine separate Datei mit Komma zu newline.sed ein (wodurch die Shell-Syntax entfällt), und es funktioniert!
Nils von Barth
1
Das ist gut, da es alles ersetzen kann, keinen Charakter. tr scheint nur mit Zeichen zu arbeiten. Wenn Sie eine Zeichenfolge als ersten Parameter eingeben, wird das gesamte Vorkommen der Zeichen ersetzt, nicht die Zeichenfolge.
Shawn
1
@Droogans Verwenden Sie Bash, Sh oder eine andere Shell? Sind Sie sicher, dass Sie einfache Anführungszeichen anstelle von doppelten Anführungszeichen verwenden?
Max Nanasy
22

Wenn Ihre sed-Verwendung eher Substitutionsausdrücke sind (wie meine), können Sie perl -pestattdessen auch verwenden

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

Anscheinend \rist der Schlüssel!

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

Verwandelte dies:

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

Dazu:

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
quelle
Ich weiß, dass die Frage OS X lautet, aber dies funktioniert nicht mit GNU sed-4.2.2-6.fc20.x86_64.
Cristian Ciupitu
10
Beachten Sie, dass dies \rnicht dasselbe ist wie \nund dass dies die weitere Manipulation und Verwendung von Daten beeinträchtigen kann.
Joel Purra
3
Entschuldigung, das hat bei mir nicht funktioniert. Ich habe gerade ein 'r' bekommen, wo es eine neue Zeile geben sollte.
Frank de Groot - Schouten
Sie sollten es in der Antwort, die dies gibt, klarer machen \r!
Pir
Es hat bei mir funktioniert, aber ich frage mich warum! \ n ist der Standard unter Unix stackoverflow.com/questions/1761051/difference-between-n-and-r
Alex
15

Dies funktioniert unter MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) und RHE Linux (Red Hat Enterprise Linux Server Version 5.3, Tikanga) ...

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

... wo das ^Jmit ctrl+ v+ gemacht wird j. Beachten Sie die \vor dem ^J.

PS, ich weiß, dass das Sed in RHEL GNU ist, das MacOS Sed FreeBSD-basiert ist, und obwohl ich mir über das Solaris Sed nicht sicher bin, glaube ich, dass dies mit jedem Sed ziemlich gut funktioniert. YMMV tho '...

Ramon Rey
quelle
12

MacOS ist anders, es gibt zwei Möglichkeiten, um dieses Problem mit sed in mac zu lösen

  • Verwenden Sie zuerst \'$'\n''Ersetzen \n, es kann unter MacOS funktionieren:

    sed 's/,/\'$'\n''/g' file
    
  • Im zweiten Fall verwenden Sie einfach eine leere Zeile:

    sed 's/,/\
    /g' file
    
  • Ps. Achten Sie auf den durch getrennten Bereich '

  • die dritte, gnu-sed verwenden, ersetzen die mac-sed

Netzwerk
quelle
7

Um es zu vervollständigen, funktioniert dies auch:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
Ryenus
quelle
1
Dies wäre auch passend für den Obfuscated C-Wettbewerb, außer es ist Bash;)
Aaron R.
@ AaronR. Genau :-). Sicherlich bevorzuge ich die trLösung, die bereits die akzeptierte Antwort ist.
Ryenus
1
Dies funktionierte unter OS X. Warum ist es \n\rstatt \r\n? Ich habe versucht, \r\nwelche Reihenfolge unter Windows erforderlich ist. Nachdem ich dies getan habe , bleiben jedoch viele ^MWagenrücklaufzeichen übrig vim, daher denke ich, dass es nur sein soll, \naber \nalleine nicht funktioniert.
NobleUplift
4

Obwohl ich zu spät zu diesem Beitrag komme, aktualisiere ich nur meine Ergebnisse. Diese Antwort gilt nur für Mac OS X.

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

Im obigen Befehl habe ich mit Umschalt + Eingabetaste versucht, eine neue Zeile hinzuzufügen, die nicht funktioniert hat. Also habe ich diesmal versucht, der "entkoppelten Newline" zu "entkommen", wie der Fehler zeigt.

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

Hat funktioniert! (unter Mac OS X 10.9.3)

user2300875
quelle
Dies ist nicht anders als die Antwort von Max Nanasia zwei Jahre vor Ihrer.
miken32
2

Nur zur Verdeutlichung: Manpage von sed unter OSX (10.8; Darwin Kernel Version 12.4.0) sagt:

[...]

Sed Reguläre Ausdrücke

 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.

[...]

also muss man wohl tr - wie oben erwähnt - oder das nifty verwenden

sed "s/,/^M
/g"

Hinweis: Sie müssen < ctrl> -v, < return> eingeben , um '^ M' im vi-Editor zu erhalten

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

...

Funktioniert für mich auf Mojave

Paulo Henrique Lellis Gonalves
quelle
1

sedunter macOS Mojave wurde 2005 veröffentlicht. Eine Lösung besteht darin, die gnu-sed,

brew install gnu-sed

dann wird verwenden gsed, was Sie wünschen,

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

Wenn Sie es vorziehen sed, nur sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', was von vorgeschlagen wird brew info gnu-sed. Starten Sie Ihren Begriff neu, dann ist Ihre sedBefehlszeile gsed.

DawnSong
quelle
0

FWIW, die folgende Zeile funktioniert in Windows und ersetzt Semikolons in meinen Pfadvariablen durch eine neue Zeile. Ich verwende die Tools, die in meinem Git Bin-Verzeichnis installiert sind.

echo %path% | sed -e $'s/;/\\n/g' | less
Jeff LaFay
quelle