検索と置換は私の「$ 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///$1perl -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

関連情報