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 $1
keine Erfassungsgruppe , sodass es nichts enthalten würde. ( oder Sie davor warnen würde.)s///
$1
perl -w
use 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 g
Flag - 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