2011-12-20 10 views
10

チップ、Dirkland、DrobæSphere社、cdirkland @ hotmail.com、米国スキップ/ SED

で非ASCII文字を削除し、私は.CSVに電子メールアドレスを変更するためのsedを使用しようとしてきましたしかし、上記の行は次のようにコマンドを使用して、私をトリップ続け:私は「は無効な照合文字」エラーを取得するよう

sed -i 's/[\d128-\d255]//' FILENAME 

from this stackoverflow question

が動作するようには思えません。

理想的には、結合AE文字を変更したくないのですが、そのテキストを操作しようとしているのではなく、電子メールアドレスを操作しようとしています。そのAEがそこにある限り、私のsed置換は1行後に失敗しますが、文字を削除するとファイル全体が正常に処理されます。

アイデア?

答えて

4

これはあなたのために働くかもしれない(GNU SED):

echo "Chip,Dirkland,DrobæSphere Inc,[email protected],usa" | 
sed 's/\o346/a+e/g' 
Chip,Dirkland,Droba+eSphere Inc,[email protected],usa 

が続いて元に戻すあなたがしなければならない何をして後には実行します。

echo "Chip,Dirkland,Droba+eSphere Inc,[email protected],usa" | 
sed 's/a+e/\o346/g' 
Chip,Dirkland,DrobæSphere Inc,[email protected],usa 

あなたは、文字列でトリッキーなキャラクターを持っている場合sedl0コマンド(hereを参照)を使用する方法を理解する。また、難しい正規表現のデバッグにも非常に便利です。

echo "Chip,Dirkland,DrobæSphere Inc,[email protected],usa" | 
sed -n 'l0' 
Chip,Dirkland,Drob\346Sphere Inc,[email protected],usa$ 
+0

+1です。他にも 'sedsed.py'スクリプトがあります(こちらはhttp://aurelio.net/sedsed/)。パターンとスペースを検査するのに便利です。この場合は役立たないかもしれませんが、便利なデバッグツールではありません。 :) –

+0

sed -n 'l0'コマンドが面白いですが、それは会社のために印刷されます:Drob \ 357 \ 277 \ 275Sphere Inc – xref

+0

そして私はまだそれを扱うための上記の例は得られません。 Windows LibreOfficeではAEとして表示されていますが、どこにもありません)は実際にはユニコードで表現できないという特殊文字ですか? http://www.fileformat.info/info/unicode/char/fffd/index.htm – xref

0

これにはawkを指定してくださいフィールドセパレータは何も設定しませんでした。その後、各文字をループします。 if loopを使用して、character classと一致するかどうかを確認してください。それ以外の場合はそれを無視して印刷します。

awk -v FS="" '{for(i=1;i<=NF;i++) if($i ~ /[A-Za-z,[email protected] ]/) printf $i}' 

テスト:

[jaypal:~/Temp] echo "Chip,Dirkland,DrobæSphere Inc,[email protected],usa" | 
awk -v FS="" '{for(i=1;i<=NF;i++) if($i ~ /[A-Za-z,[email protected] ]/) printf $i}' 
Chip,Dirkland,DrobSphere Inc,[email protected],usa 

を更新:

awk -v FS="" '{for(i=1;i<=NF;i++) if($i ~ /[A-Za-z,[email protected] ]/) printf $i; printf "\n"}' <datafile.csv> asciidata.csv 

私は別々のラインを保つためにループの後の "n \" printf関数が追加されました。

+0

あなたがdatafile.csvを処理したい場合、これは修正されるだろうかおかげJaypal、 asciidata.csvを出力しますか? – xref

+0

私は答えを更新しました。希望が助けてくれる! –

+0

あなたの入力ファイルから抽出された電子メールアドレスだけが必要な場合、 'awk'は複雑な' regex'を使わずに簡単にそれを行うことができます。それがどのように機能するか教えてください。 'l0'に対しては –

4
sed -i 's/[^[:print:]]//' FILENAME 

また、これは単なる削除で悩まないで、非ASCII文字をスキップする方法がある。この場合、DOS2UNIX

+0

動作しません。 [:print:]はASCIIと同じではありません。 'ü'は印字可能ですがASCIIではありません。 –

1

私はこのsedコマンドs/[\x00-\x1F]/ /g;を試してきました。同じエラーメッセージが表示されました。

この場合には、それは単にs/[\x01-\x1F]/ /g;

を得、照合から\x00を削除すればよい残念ながら、それはすべての文字上記と\x7Fや他のいくつかを含むように思えるこの短いスクリプトで見られるように、禁止されています

for ((i=0; i<=255; i++)); do 
    printf "== $i - \x$(echo "ibase=10;obase=16;$i" | bc) ==" 
    echo '' | sed -E "s/[\d$i-\d$((i+1))]]//g" 
done 

問題は、これらの文字を使用して範囲を指定することのみであることに注意してください。手動またはスクリプトごとにそれらをすべて一覧表示することはできます。例えば。あなたの例に戻ってきて:

sed -i 's/[\d128-\d255]//' FILENAME 

はに変換でしょう

c=; for ((i=128; i<255; i++)); do c="$c\d$i"; done 
sed -i 's/['"$c"']//' FILENAME 

なる:

sed -i 's/[\d128\d129\d130\d131\d132\d133\d134\d135\d136\d137\d138\d139\d140\d141\d142\d143\d144\d145\d146\d147\d148\d149\d150\d151\d152\d153\d154\d155\d156\d157\d158\d159\d160\d161\d162\d163\d164\d165\d166\d167\d168\d169\d170\d171\d172\d173\d174\d175\d176\d177\d178\d179\d180\d181\d182\d183\d184\d185\d186\d187\d188\d189\d190\d191\d192\d193\d194\d195\d196\d197\d198\d199\d200\d201\d202\d203\d204\d205\d206\d207\d208\d209\d210\d211\d212\d213\d214\d215\d216\d217\d218\d219\d220\d221\d222\d223\d224\d225\d226\d227\d228\d229\d230\d231\d232\d233\d234\d235\d236\d237\d238\d239\d240\d241\d242\d243\d244\d245\d246\d247\d248\d249\d250\d251\d252\d253\d254\d255]//' FILENAME 
+0

"残念ながら、\ x7Fを含むすべての文字のように見えますが、他の文字は禁止されています_"ありがとう!これはなぜ私が '不正な照合文字'エラーを得ているのかを説明したものです。 – xpt