使用sed删除非字母数字字符

时间:2013-11-15 17:41:11

标签: bash replace sed

我正在尝试验证一些输入以删除一组字符。只允许使用字母数字字符加,句号,下划线,连字符。我已在此处http://gskinner.com/RegExr/测试了正则表达式[^\w.-],并且它与我想删除的内容相匹配,因此我不确定为什么sed正在返回相反的内容。我错过了什么?

我的最终目标是输入"Â10.41.89.50 "并获取"10.41.89.50“。

我试过了:

echo "Â10.41.89.50 " | sed s/[^\w.-]//g返回Â...

echo "Â10.41.89.50 " | sed s/[\w.-]//gecho "Â10.41.89.50 " | sed s/[\w^.-]//g返回Â10418950

我尝试了Skip/remove non-ascii character with sed中找到的答案,但没有删除任何内容。

6 个答案:

答案 0 :(得分:43)

-c(补语)标志可能是一个选项

echo "Â10.41.89.50-._ " | tr -cd '[:alnum:]._-'

答案 1 :(得分:13)

您可能希望改为使用[:alpha:]类:

echo "Â10.41.89.50 " | sed "s/[[:alpha:].-]//g"

应该有效。如果没有,您可能需要更改本地设置。

另一方面,如果你只想保留数字,连字符和句号::

echo "Â10.41.89.50 " | sed "s/[^[:digit:].-]//g"

如果您的字符串位于变量中,则可以使用纯bash和parameter expansions

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[^[:digit:].-]/}
$ echo "$clean"
10.41.89.50

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[[:alpha:]]/}
$ echo "$clean"
10.41.89.50

您还可以查看1_CR的答案。

答案 2 :(得分:5)

好的sed不支持unicode字符。请改用perl

> s="Â10.41.89.50 "
> perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50

答案 3 :(得分:0)

<`[[:alnum:]_.@]`

这对我来说很好。它保留了我为我的目的指定的所有字符。

答案 4 :(得分:0)

根据anubhava的回答,这个对我有用:

s/^[[:alnum:]]//g

用单个空格替换除字母数字以外的任何内容。

注意:“。”字符被保留

答案 5 :(得分:0)

要删除除字母数字和“-”以外的所有字符,请使用以下代码:

echo "a b-1_2" | sed "s/[^[:alnum:]-]//g"