Ich habe eine Zeichenfolge wie:testfsdfsdftestfsdkflsdtestsdfsdfsdf
Ich frage mich, wie ich die Zeichenfolge trennen kann, sodass sie testfsdfsdf
in der ersten Zeile erscheint, testfsdkflsd
in der zweiten Zeile erscheint usw., etwa so:
testfsdfsdf
testfsdkflsd
testsdfsdfsdf
Ich habe versucht, sed
find test
und alles, was danach kommt, mit zu verwenden sed 's/test.*/
, aber ich frage mich, wie ich es test.*
erneut drucken kann. Soweit ich weiß sed
, kann man mit verwenden, um eine bestimmte Zeichenfolge zu finden und sie dann durch etwas anderes zu ersetzen. Eigentlich wollte ich also etwas wie versuchen sed 's/test.*/[reprint test.* here]\n/g'
, aber wenn ich es mache sed 's/test.*/test.*\n/g'
, wird nur ausgegeben test.*
. Gibt es eine Möglichkeit, die mit gefundene Zeichenfolge erneut auszudrucken sed
, oder kann dies mit einem anderen Befehl erfolgen?
Ich habe auch sed ausprobiert 's/\(test.*\)test/\1\ntest/g'
, was funktioniert, wenn nur zwei Instanzen von vorhanden sind test[random characters]
, aber nicht drei oder mehr. Mit der Zeichenfolge testfsdfsdftestfsdkflsdtestsdfsdfsdf
wird nur Folgendes ausgegeben:
testfsdfsdftestfsdkflsd
testsdfsdfsdf
Antwort1
Sie sind nah dran. Der gewünschte sed-Befehl lautet
sed 's/test/\ntest/g'
Es stellt jedem ein Zeilenumbruchzeichen voran test
.
Obwohl GNU sed und möglicherweise andere es tun, \n
wird die Interpretation als Zeilenumbruch nicht spezifiziert durchPOSIXUm den Befehl portierbar zu machen, ist ein wörtlicher, maskierter Zeilenumbruch erforderlich.
sed 's/test/\
test/g'
Sie werden jedoch feststellen, dass, wenn es test
sich um die ersten vier Zeichen der Zeile handelt, wie es in Ihrem Beispiel der Fall ist, am Anfang der Ausgabe eine leere Zeile erstellt wird. Wenn dies nicht passieren soll, können wir verwenden
sed 's/\(.\)test/\1\ntest/g'
.
test
passt zu jedem Zeichen, daher ist die Existenz eines Zeichens davorerforderlich, andernfalls stimmt der reguläre Ausdruck nicht überein. D. h., wenn test
dies die erste Zeichenfolge in der Zeile ist, .
kann nichts übereinstimmen und die Ersetzung wird nicht vorgenommen.
Und für die tragbare Alternative,
sed 's/\(.\)test/\1\
test/g'
Einige Tests mit GNU sed:
$ sed 's/test/\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'
testfsdfsdf
testfsdkflsd
testsdfsdfsdf
$ sed 's/\(.\)test/\1\ntest/g' <<< 'testfsdfsdftestfsdkflsdtestsdfsdfsdf'
testfsdfsdf
testfsdkflsd
testsdfsdfsdf
Ich habe auch versucht
sed 's/\(test.*\)test/\1\ntest/g'
, was funktioniert, wenn nur zwei Instanzen von vorhanden sindtest
, aber nicht drei oder mehr.
Das liegt daran, dass .*
es gierig ist, d. h. es wird alles abgleichen, was es kann. Zum Beispiel:
grep --color=always "b.*b" <<< abcabcabc
Farben/passen zu allem, vom ersten bis zumzuletzt b
.