Ich habe eine Textdatei mit folgenden Daten und jede Zeile endet mit |END|
.
T|somthing|something|END|T|something2|something2|END|
Ich tryig ersetzen |END|
mit \n
neuer Linie mit sed.
sed 's/\|END\|/\n/g' test.txt
Aber es erzeugt eine falsche Ausgabe wie unten:
T
|
s
o
m
e
...
Aber was ich will ist folgendes:
T|somthing|something
T|something2|something2
Ich habe es auch mit versucht tr
. Es hat auch nicht funktioniert.
Antworten:
Benutze das:
Was Sie versucht haben, funktioniert nicht, weil sed grundlegende reguläre Ausdrücke verwendet und Ihre sed-Implementierung einen
\|
Operator hat, der "oder" bedeutet (eine häufige Erweiterung von BRE). Das, was Sie geschrieben haben, wird alsoEND
durch eine neue Zeile ersetzt (leere Zeichenfolge oder leere Zeichenfolge).quelle
\n
). In der Frage wird gefragt, wie|END|
durch eine neue Zeile ersetzt werden soll, nicht durch\n
.Folgendes hat für mich gut funktioniert:
Beachten Sie, dass ich nur einen Backslash gefolgt von der Eingabetaste eingefügt habe.
quelle
\n
wie in der Antwort von @ AB würde bei einigensed
Implementierungen nicht funktionieren .\|
Wechsel in einem regulären Ausdruck,\n
bedeutet aber nicht newline in einems
Ersatz?Sie können verwenden
awk
:-F'\\|END\\|'
Feldtrennzeichen auf setzen|END|
OFS='\n'
Setzen Sie das Ausgabefeldtrennzeichen auf newline$1=$1
Ursacheawk
Rekonstruktion$0
mitOFS
als Feldtrennzeichen1
ist ein wahrer Wert, daawk
die gesamte Eingabezeile gedruckt wirdquelle
Ein anderer möglicherweise awk- Befehl, der seine
RS
Option verwendet, wäre:Werden die Datensätze gedruckt werden (basierend auf awk des R ecord S eparator) , die nicht leer sind (mindestens ein Feld) Drucken Leerzeilen zu verhindern.
Getestet an diesem Eingang:
Gibt diese Ausgabe:
Damit wurden alle Leerzeilen gelöscht :) Wenn Sie auch Zeilenumbrüche wünschen, ersetzen Sie diese
$1=$1
durch den$0
Befehl in:quelle
$1=$1
komprimiert Leerzeichenfolgen zu einem Leerzeichen und gibt false zurück, wenn das erste Feld 0 ist. Das macht keinen Sinn. Sie wollen wahrscheinlichawk 1 RS='\\|END\\|'
oderawk NF RS='\\|END\\|'
oderawk length RS='\\|END\\|'
hier. Beachten Sie, dass ein Regexp RS Gawk oder Mawk erfordertEin anderer Weg, bei
sed
dem keine leeren Zeilen gedruckt werden:zB Eingabe:
Ausgabe:
das Gleiche mit
ed
:quelle
Wie hier von Walter Mundt erwähnt , können wir dies mit einer ANSI C-Zeichenfolge erreichen
Weitere Alternativen finden Sie unter dem obigen Link.
Sie können auch die folgende Syntax verwenden. Ich bin mir nicht sicher, ob sie unter allen Unix / Linux-Varianten funktioniert
quelle
Ich hatte das gleiche Problem in der strengen Posix-Shell, das ich in zwei Durchgängen mit einem nicht verwendeten Zeichen gemacht habe
quelle