検索と置換が「$1」トークンを尊重しない

検索と置換が「$1」トークンを尊重しない

Ubuntu 14.04でbashシェルを使用しています。ファイルの各行に対して簡単な検索と置換を実行しようとしています。試してみました

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

しかし、これでファイルがいっぱいになってしまった

DELETE FROM my_object_times where ID = '';

キャプチャしたいものがすべて挿入されていません。この検索と置換を実行するより良い方法は何ですか?最終結果は次のようなものになると思っていました

DELETE FROM my_object_times where ID = 'abcdef12341234abcdef';

答え1

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

Perl スニペットは二重引用符で囲まれているため、シェルは$1現在の値 (おそらく空または未設定) に展開されます。これを防ぐには、ドル記号をエスケープする必要があります。また、演算子のパターンにキャプチャ グループがないためs///$1何も含まれません。 (perl -wまたは、use warningsこれについて警告が表示されます。)

パターンに括弧を追加するか、 を使用してください$&。また、グローバル置換は幅がゼロになる可能性のあるパターンではうまく機能しないようですので、g- フラグを削除することをお勧めします。

それで:

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

(ただし、&はシェルでは有効な変数ではないため、そのまま$&残されます。ただし、一般的には、$をエスケープする必要があります。)

通常、Perl ではドル記号がかなり一般的なので、Perl コードを一重引用符で囲むのが適切です。しかし、ここでは Perl コード内の一重引用符が少し難しくなっています。1 つのオプションは、16 進数で表すことです。

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

答え2

こうすればできます:

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

関連情報