如何使用sed删除特殊字符

时间:2018-07-13 08:57:48

标签: regex linux bash sed

我想了解如何使用sed仅从以下echo命令中删除空格和奇异字符:

echo -e "A \xd8\xa8"

所以我尝试了:

echo -e "A \xd8\xa8" | sed -r "s/[^[:print:]]//g"

但不会删除任何内容,

echo -e "A \xd8\xa8" | sed -r "s/[^[:alnum:]]//g"

仅删除空格

echo -e "A \xd8\xa8" | sed -r "s/[^[:alpha:]]//g"

(结果相同),

echo -e "A \xd8\xa8" | sed -r "s/[^[:ascii:]]//g"

返回错误(无效的字符类名称),并且

echo -e "A \xd8\xa8" | sed -r "s/[^\w ]//g"

删除所有内容...

预期结果:“ A”

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您想sed 考虑,例如阿拉伯字符为字母(必须是字母),因此您需要设置一个不考虑它们的语言环境。

“ C”语言环境仅考虑基本字符集,即仅[A-Za-z]为字母。我假设您要删除的是该范围内不是字符的所有内容(您的问题对您真正想要的是模糊的):

echo -e "A \xd8\xa8" | LC_CTYPE=C sed -r "s/[^[:alpha:]]//g" | hexdump -C

输出:

00000000  41 0a
00000002

答案 1 :(得分:2)

原始文本:

$ echo -e 'A \xd8\xa8' | od -c
0000000   A     330 250  \n
0000005

删除非ASCII字符:

$ echo -e 'A \xd8\xa8' | sed 's/[^\x00-\x7F]//g' | od -c
0000000   A      \n
0000003

删除空格:

$ echo -e 'A \xd8\xa8' | sed 's/[[:space:]]//g' | od -c
0000000   A 330 250  \n
0000004

删除非ASCII字符和空格:

$ echo -e 'A \xd8\xa8' | sed 's/[^\x00-\x7F]//g; s/[[:space:]]//g' | od -c
0000000   A  \n
0000002

$ echo -e 'A \xd8\xa8' | sed -E 's/[^\x00-\x7F]|[[:space:]]//g' | od -c
0000000   A  \n
0000002

答案 2 :(得分:-1)

尝试一下:

[[1]]
[1] "chairman of the board"

[[2]]
[1] "chief executive officer"

[[3]]
[1] "president"

一种替代方法是打印所有ASCII范围(但空格字符和控制字符):

$ echo -e "A \xd8\xa8 ña ñe ño áÄãç " | sed -r "s/[^a-zA-Z0-9]//g"
Aaeo