3番目のフィールドに、hotmailという単語を含む.txtファイルからすべての電子メールを削除しようとしています。現在、以下を使用しようとしていますが、一部の行のみが削除されます。なぜかはわかりませんが
sed -i '/^[^,]*,[^,]*,[^,]*hotmail/d' *.txt
以下は削除されていない行の1つです。
"field1","field2.","[email protected]","whoeditedoutn.com","NeditedoutOW.COM|NeditedoutW.COM","editedout",""
"foo,bar","baz,qux","[email protected]","whoeditedoutn.com","NeditedoutOW.COM|NeditedoutW.COM","editedout",""
誰でも私に正しい命令を出すことができますか?可能であれば、単語に大文字と小文字、またはhotmail
その他HoTmAiL
のバリアントの両方を含めるように注文してください。
ベストアンサー1
これはCSVファイルなので、フィールド1と2にカンマを含めることができます。したがって、正規表現の一致は機能しません。適切なCSVパーサーが必要です。これは例です
ruby -rcsv -ne 'row = CSV::parse_line($_); puts $_ unless row[2] =~ /hotmail/i' file
修正する:このRubyコマンドはファイルを変更しません。上記のsedコマンドも同様です。変更をファイルに再保存するには、この-i
オプションを使用します。 Pastebinデータの使用:
wc -l file
ruby -rcsv -i -ne 'row = CSV::parse_line($_); puts $_ unless row[2] =~ /hotmail/i' file
wc -l file
22 file
20 file
PerlにはCSVモジュールもありますが、標準ではありません。CPANで獲得- エラー処理が実装されていません。
perl -MText::CSV -le '
$csv = Text::CSV->new({ binary=>1, always_quote=>1 });
open $fh, "<", shift(@ARGV);
while ($row = $csv->getline($fh)) {
$csv->print(STDOUT, $row) unless $row->[2] =~ /hotmail/i;
}
' file