Sie können Perl-Einzeiler verwenden, ähnlich wie Sie es mit sed tun, mit dem Vorteil der vollständigen Unterstützung von Perl-regulären Ausdrücken (die viel leistungsfähiger ist als das, was Sie mit sed erhalten). Es gibt auch sehr geringe Unterschiede zwischen * nix-Plattformen - Perl ist im Allgemeinen Perl. Sie können also aufhören, sich Gedanken darüber zu machen, wie Sie die sed-Version Ihres bestimmten Systems dazu bringen können, das zu tun, was Sie wollen.
In diesem Fall können Sie tun
perl -pe 's/(regex)/\n$1/'
-pe
Versetzt Perl in eine "Execute and Print" -Schleife, ähnlich wie bei der normalen Betriebsart von sed.
'
zitiert alles andere, damit die Shell nicht stört
()
Um den regulären Ausdruck herum befindet sich ein Gruppierungsoperator. $1
Auf der rechten Seite der Substitution wird gedruckt, was in diesen Parens übereinstimmte.
Schließlich \n
ist eine neue Zeile.
Unabhängig davon, ob Sie Klammern als Gruppierungsoperator verwenden, müssen Sie alle Klammern, mit denen Sie übereinstimmen möchten, maskieren. Ein Regex, der dem oben aufgeführten Muster entspricht, wäre also so etwas wie
\(\d\d\d\)\d\d\d-\d\d\d\d
\(
oder \)
entspricht einem wörtlichen Paren und \d
einer Ziffer.
Besser:
\(\d{3}\)\d{3}-\d{4}
Ich kann mir vorstellen, dass Sie herausfinden können, was die Zahlen in geschweiften Klammern bewirken.
Darüber hinaus können Sie andere Trennzeichen als / für Ihre Regex verwenden. Wenn Sie also übereinstimmen müssen, müssen Sie nicht entkommen. Beides entspricht dem regulären Ausdruck zu Beginn meiner Antwort. Theoretisch können Sie die Standards durch ein beliebiges Zeichen ersetzen .
perl -pe 's#(regex)#\n$1#'
perl -pe 's{(regex)}{\n$1}'
Ein paar letzte Gedanken.
Verwenden -ne
anstelle von -pe
verhält sich ähnlich, druckt aber am Ende nicht automatisch. Dies kann nützlich sein, wenn Sie selbst drucken möchten. Beispiel: Hier ist ein Grep-Alike ( m/foobar/
ist ein Regex-Match):
perl -ne 'if (m/foobar/) {print}'
Wenn Sie Probleme beim Umgang mit Zeilenumbrüchen haben und möchten, dass diese auf magische Weise für Sie erledigt werden, fügen Sie hinzu -l
. Nicht nützlich für das OP, das mit Zeilenumbrüchen arbeitete.
Bonus-Tipp - Wenn Sie das PCRE-Paket installiert haben, wird es mitgeliefert pcregrep
, das vollständige Perl-kompatible Regexes verwendet.
sed '/regex/G'