Wie lässt sich eine gefundene Zeichenfolge mithilfe von sed oder einem anderen Befehl erneut drucken?

Wie lässt sich eine gefundene Zeichenfolge mithilfe von sed oder einem anderen Befehl erneut drucken?

Ich habe eine Zeichenfolge wie:testfsdfsdftestfsdkflsdtestsdfsdfsdf

Ich frage mich, wie ich die Zeichenfolge trennen kann, sodass sie testfsdfsdfin der ersten Zeile erscheint, testfsdkflsdin der zweiten Zeile erscheint usw., etwa so:

testfsdfsdf
testfsdkflsd
testsdfsdfsdf

Ich habe versucht, sedfind testund 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 testfsdfsdftestfsdkflsdtestsdfsdfsdfwird 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, \nwird 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 testsich 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'

.testpasst zu jedem Zeichen, daher ist die Existenz eines Zeichens davorerforderlich, andernfalls stimmt der reguläre Ausdruck nicht überein. D. h., wenn testdies 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 sind test, 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.

verwandte Informationen