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
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
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 '...
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.
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.
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
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.
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.
tr , '\n'
. Ich denke, sed behandelt\n
als einfachen Text.tr , '\n' < file
- kein Rohr.g
am Ende des Skripts? Ich bekomme das gleiche Verhalten ohne es.Antworten:
Verwenden Sie
tr
stattdessen:quelle
tr ',' ';' < input.csv > output.csv
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\n
eine echte Newline ersetzt, aber dann müssen Sie den Backslash verdoppeln, den sed sieht, um der Newline zu entkommen, zBeachten Sie, dass dies nicht bei allen Shells funktioniert , sondern bei den gängigsten.
quelle
echo "a,b" | sed -e $'s/,/\\n/g
.man bash
.sed -E $'s/<\\/br>/\\\n/g' file
zum-e
Teil scheint nicht notwendig.funktioniert unter Mac OS X.
quelle
Wenn Ihre sed-Verwendung eher Substitutionsausdrücke sind (wie meine), können Sie
perl -pe
stattdessen auch verwendenquelle
Anscheinend
\r
ist der Schlüssel!Verwandelte dies:
Dazu:
quelle
\r
nicht dasselbe ist wie\n
und dass dies die weitere Manipulation und Verwendung von Daten beeinträchtigen kann.\r
!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) ...
... wo das
^J
mit 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 '...
quelle
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:Im zweiten Fall verwenden Sie einfach eine leere Zeile:
Ps. Achten Sie auf den durch getrennten Bereich
'
die dritte, gnu-sed verwenden, ersetzen die mac-sed
quelle
Um es zu vervollständigen, funktioniert dies auch:
quelle
tr
Lösung, die bereits die akzeptierte Antwort ist.\n\r
statt\r\n
? Ich habe versucht,\r\n
welche Reihenfolge unter Windows erforderlich ist. Nachdem ich dies getan habe , bleiben jedoch viele^M
Wagenrücklaufzeichen übrigvim
, daher denke ich, dass es nur sein soll,\n
aber\n
alleine nicht funktioniert.Obwohl ich zu spät zu diesem Beitrag komme, aktualisiere ich nur meine Ergebnisse. Diese Antwort gilt nur für Mac OS X.
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.
Hat funktioniert! (unter Mac OS X 10.9.3)
quelle
Nur zur Verdeutlichung: Manpage von sed unter OSX (10.8; Darwin Kernel Version 12.4.0) sagt:
[...]
Sed Reguläre Ausdrücke
[...]
also muss man wohl tr - wie oben erwähnt - oder das nifty verwenden
Hinweis: Sie müssen < ctrl> -v, < return> eingeben , um '^ M' im vi-Editor zu erhalten
quelle
...
Funktioniert für mich auf Mojave
quelle
sed
unter macOS Mojave wurde 2005 veröffentlicht. Eine Lösung besteht darin, diegnu-sed
,dann wird verwenden
gsed
, was Sie wünschen,Wenn Sie es vorziehen
sed
, nursudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
, was von vorgeschlagen wirdbrew info gnu-sed
. Starten Sie Ihren Begriff neu, dann ist Ihresed
Befehlszeilegsed
.quelle
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.
quelle