Suchen und Ersetzen beachtet mein „$1“-Token nicht

Suchen und Ersetzen beachtet mein „$1“-Token nicht

Verwendung der Bash-Shell unter Ubuntu 14.04. Versuch, eine einfache Suche und Ersetzung in jeder Zeile einer Datei durchzuführen. Ich habe versucht

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

aber das hinterlässt mir eine Datei voller

DELETE FROM my_object_times where ID = '';

und alles, was ich erfassen wollte, wird überhaupt nicht eingefügt. Was ist ein besserer Weg, dieses Suchen und Ersetzen durchzuführen? Ich hatte erwartet, dass die Endergebnisse ungefähr so ​​aussehen würden

DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';

Antwort1

perl -pi -e "s/.*/DELETE FROM my_object_times where ID = '$1';/g" ids.csv

Da der Perl-Ausschnitt in Anführungszeichen steht, wird die Shell auf den aktuellen Wert erweitert (in Ihrem Fall wahrscheinlich leer oder nicht gesetzt). Um dies zu verhindern, müssen Sie das Dollarzeichen maskieren. Außerdem haben Sie im Muster des Operators $1keine Erfassungsgruppe , sodass es nichts enthalten würde. ( oder Sie davor warnen würde.)s///$1perl -wuse warnings

Fügen Sie dem Muster entweder Klammern hinzu oder verwenden Sie $&. Außerdem scheint der globale Ersatz bei einem Muster, das die Breite Null haben kann, nicht gut zu funktionieren, daher würde ich vorschlagen, das gFlag - zu entfernen.

Also:

perl -w -pe "s/.*/DELETE FROM my_object_times where ID = '\$&';/" 

(Ist allerdings &in der Shell keine gültige Variable und $&wird daher so belassen. Im Allgemeinen $müsste jedoch maskiert werden.)

Normalerweise wäre es besser, den Perl-Code in einfache Anführungszeichen zu setzen, da das Dollarzeichen in Perl recht häufig vorkommt. Aber hier machen die einfachen Anführungszeichen im Perl-Code das etwas schwierig. Eine Möglichkeit besteht darin, sie in Hexadezimalform darzustellen:

perl -w -pe 's/.*/DELETE FROM my_object_times where ID = \x27$&\x27;/' 

Antwort2

So funktioniert es:

sed -i "s/.*/DELETE FROM my_object_times where ID = '&';/" ids.csv

verwandte Informationen