2016-04-11 5 views
1

Ich versuche sed zu verwenden, um eine Reihe von Textzeilen in einer Datei, die wie folgt aussehen zu verwandeln:Wie transformieren Sie diese Zeilen mit erfassten Gruppen?

{ Interop.SecurityStatus.AlgorithmMismatch, SecurityStatusPalErrorCode.AlgorithmMismatch }, 
{ Interop.SecurityStatus.BadBinding, SecurityStatusPalErrorCode.BadBinding }, 
{ Interop.SecurityStatus.BufferNotEnough, SecurityStatusPalErrorCode.BufferNotEnough }, 
{ Interop.SecurityStatus.CannotInstall, SecurityStatusPalErrorCode.CannotInstall }, 

dazu:

[Interop.SecurityStatus.AlgorithmMismatch] = SecurityStatusPalErrorCode.AlgorithmMismatch, 
[Interop.SecurityStatus.BadBinding] = SecurityStatusPalErrorCode.BadBinding, 
[Interop.SecurityStatus.BufferNotEnough] = SecurityStatusPalErrorCode.BufferNotEnough, 
[Interop.SecurityStatus.CannotInstall] = SecurityStatusPalErrorCode.CannotInstall, 

Dies ist, was ich versucht habe so weit erreichen dies, mein rostiges regexp Wissen mit:

$ sed -i 's/{ (.*), (.*) }/\[\1\] = \2/g' file_name 

Leider scheint es nicht zu funktionieren, wie ich wieder diesen Fehler von meinem Terminal bekommen:

sed: -e expression #1, char 30: invalid reference \2 on `s' command's RHS 

Ich bin nicht sicher, warum dies geschieht, denn soweit ich I 2 Klammern haben sehen kann (und damit 2 erfaßt Gruppen). Kann mir jemand erklären, warum sed diesen Fehler zurückgibt und wie man ihn repariert? Vielen Dank.

Antwort

1

standardmäßig und gemäß dem POSIX spec verwendet sedGrund reguläre Ausdrücke (BREs), in denen ( und ) sind gewöhnlichen Zeichen und deshalb muss \ -quoted als Metazeichen zu handeln in Um Erfassungsgruppen so zu erstellen, wie Sie beabsichtigen (beachten Sie jedoch, dass { und }auch als gewöhnliche Zeichen behandelt werden, die Sie tun wollen):

sed -i 's/{ \(.*\), \(.*\) }/\[\1\] = \2/g' file_name 

jedoch angegeben, dass Sie bereits Nicht-Standard- Option -i verwenden, können Sie auch Ihr Leben leichter machen durch die Unterstützung Aktivierung für erweitert reguläre Ausdrücke (ERE) mit GNU sed ‚s Nicht-Standard--r Option; während Sie von der Verwendung EREs in diesem speziellen Fall nicht viel gewinnen, funktionieren sie in der Regel viel mehr wie man sie (wie sie aus anderen Sprachen) erwarten:

sed -i -r 's/\{ (.*), (.*) \}/\[\1\] = \2/g' file_name 

( und ) jetzt sie Sie funktionieren Weg erwartet, aber beachten sie, dass es jetzt { und } ist, die brauchen \ um als Literale behandelt zu werden -quoted werden, weil im Rahmen der EREs sie Metazeichen in quantifiers verwendet werden (wie {1,2}).

+1

Vielen Dank für die ausführliche und informative Antwort! Lief wie am Schnürchen :) –

Verwandte Themen