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