使用sed跳过/删除非ascii字符

使用sed跳过/删除非ascii字符,sed,Sed,奇普,迪克兰,卓伯斯公司,cdirkland@hotmail.com,美国 我一直在尝试使用sed修改.csv中的电子邮件地址,但上面这行代码一直让我感到困惑,使用的命令如下: sed -i 's/[\d128-\d255]//' FILENAME 由于出现“无效排序规则字符”错误,似乎无法正常工作 理想情况下,我根本不想更改组合的AE字符,我宁愿跳过它,因为我不想操纵文本,而是要操纵电子邮件地址。只要AE在其中,尽管它会导致我的sed替换在一行之后失败,删除该字符,它就会很好地处理整个文件

奇普,迪克兰,卓伯斯公司,cdirkland@hotmail.com,美国

我一直在尝试使用sed修改.csv中的电子邮件地址,但上面这行代码一直让我感到困惑,使用的命令如下:

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

由于出现“无效排序规则字符”错误,似乎无法正常工作

理想情况下,我根本不想更改组合的AE字符,我宁愿跳过它,因为我不想操纵文本,而是要操纵电子邮件地址。只要AE在其中,尽管它会导致我的sed替换在一行之后失败,删除该字符,它就会很好地处理整个文件


有什么想法吗?

awk
怎么样。我们将字段分隔符设置为“无”。然后在每个字符上循环。使用
if循环
检查它是否与
字符类
匹配。如果有,我们打印它,否则我们忽略它

awk -v FS="" '{for(i=1;i<=NF;i++) if($i ~ /[A-Za-z,.@ ]/) printf $i}'
awk-vfs=“”{for(i=1;i这可能适合您(GNU-sed):

然后做你必须做的事情,然后再做:

echo "Chip,Dirkland,Droba+eSphere Inc,cdirkland@hotmail.com,usa" | 
sed 's/a+e/\o346/g'
Chip,Dirkland,DrobæSphere Inc,cdirkland@hotmail.com,usa
如果字符串中有棘手的字符,并且想了解
sed
是如何看到它们的,请使用
l0
命令(请参阅)。对于调试困难的正则表达式也非常有用

echo "Chip,Dirkland,DrobæSphere Inc,cdirkland@hotmail.com,usa" | 
sed -n 'l0'
Chip,Dirkland,Drob\346Sphere Inc,cdirkland@hotmail.com,usa$

此外,它的行为类似于dos2unix。在本例中,有一种方法可以跳过非ASCII字符,而不必费心删除

LANG=C sed /someemailpattern/

请参阅和。

我来这里尝试这个sed命令
s/[\x00-\x1F]//g;
,它给了我相同的错误消息

在这种情况下,只需从排序规则中删除
\x00
,即可生成
s/[\x01-\x1F]//g;

不幸的是,上面的所有字符(包括
\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
将成为

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

您遇到的问题是本地问题

如果要使用这样的排序规则范围,则需要更改字符类型和排序规则类型

此操作失败,因为\x80->\xff在utf-8字符串中无效。 注意\u0080!=\x80表示utf8

无论如何,要想让这一切顺利进行,就去做吧

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

这将覆盖LC_CTYPE和LC_COLLATE作为一个命令,并执行您想要的操作。

谢谢Jaypal,如果您想处理datafile.csv并输出asciidata.csv,这将如何修改?如果您只想从输入文件中提取电子邮件地址,那么
awk
可以轻松完成,而不需要任何复杂的
正则表达式我知道它是如何工作的。+1用于
l0
。还有另一个
sedsed.py
脚本可用。用于检查
模式
保留
空格。在这种情况下可能没有帮助,但仍然是一个有用的调试工具。:)sed-n'l0'命令很有趣,它为公司打印的是:Drob\357\277\275Sphere Incand我仍然无法使用上面的示例,可能是字符(在Windows LibreOffice中显示为AE,但在其他任何地方都没有)实际上是一个特殊的字符,表示它不能用unicode表示吗?我从来没有在这一页上得到任何完美的答案,但Poton的解决方案让我得到了最接近的答案,命令提供了一些更准确的错误细节,这无助于删除所有非ASCII字符。只帮助删除e中给出的特定字符示例.不起作用。[:print:]与ASCII不同,例如,
u
是可打印的,但不是ASCII。“不幸的是,上面的所有字符,包括\x7F和其他一些字符都是不允许的”。谢谢!这解释了为什么我会出现
无效排序规则字符
错误。
LANG=C sed /someemailpattern/
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
LC_ALL=C sed -i 's/[\d128-\d255]//' FILENAME