2016-10-28 2 views
1

Ich versuche, ein Perl-Einzeiler zu schreiben für einen String q (abc * und anhängen, um es zu suchen, wenn die Zeichenfolge gefunden wird Meine Eingabedatei ein paar Dinge wie diese hat.Perl suchen und fügen Sie

q(abc0x[... 
q(abc1x[... 
q(abc2x[... 
q(abc0y[... 

würde ich die Ausgabe gerne sein:

q(abc0x_str[... 
q(abc1x_str[... 
q(abc2x_str[... 
q(abc0y_str[... 

ich habe dies versucht:

perl -pi -e "s/(q\((abc\S+)\[)/\$1_str\1/" file 

aber die $1 zurück Referenz scheint den Wert aus meiner Umgebung zu holen, wenn ich echo $1 und Pre-pends Typen _str anstatt es zu anhängt, so dass diese Ausgabe:

-project_strq(abc0x[... 

wo $1 gerade passiert in meiner Umgebung „-Projekt“ zu sein.

Alternativ habe ich versucht:

perl -pi -e "s/(q\(abc\S+)\[)/_str\1/" file 

aber die Ausgabe hier so aussieht, anstatt mit den vorgehängten _str:

_strq(abc0x[... 

Weder Ausgang ist das, was ich erwarte. Irgendein Rat?

+0

Ist das Ihr tatsächlicher Einzeiler? Ich bekomme einen Fehler. Ich muss dem 1. rechten Paren entkommen. – toolic

Antwort

2

Dies erzeugt die gewünschte Ausgabe:

perl -pi -e 's/(q\(abc\S+)\[/$1_str[/' file 

Wie Sie bemerkt haben, die Shell $ 1 als Shell-Variable interpretiert. Sie müssen einfache Anführungszeichen verwenden, um zu verhindern, dass die Shell sie als Variable behandelt.

Der One-Liner, den Sie ursprünglich gepostet haben, erzeugt einen Fehler für mich (ich sehe, dass Sie jetzt Ihren ursprünglichen Code bearbeitet haben).

0

$ 1 wird von bash interpretiert, da Sie Ihren Perl-Code in "..." angeben. Ersetzen Sie Ihren Einzeiler mit:

Wie in Perl interpretieren einfache Anführungszeichen den Inhalt nicht.

Ich reparierte auch \1 und ersetzte es durch [.

Verwandte Themen