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

gor*_*ike 32 bash replace sed

我正在尝试验证一些输入以删除一组字符.只允许使用字母数字字符加,句号,下划线,连字符.我[^\w.-]在http://gskinner.com/RegExr/上测试了正则表达式,它匹配我想要删除的内容,所以我不确定为什么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.-]//g并echo "Â10.41.89.50 " | sed s/[\w^.-]//g返回Â10418950

我尝试了这里找到的答案用sed跳过/删除非ascii字符,但没有删除任何内容.

iru*_*var 49

的-c(补体)标志可能是一种选择

echo "Â10.41.89.50-._ " | tr -cd '[:alnum:]._-'
Run Code Online (Sandbox Code Playgroud)


pan*_*icz 15

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

echo "a b-1_2" | sed "s/[^[:alnum:]-]//g"
Run Code Online (Sandbox Code Playgroud)


gni*_*urf 14

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

echo "Â10.41.89.50 " | sed "s/[[:alpha:].-]//g"
Run Code Online (Sandbox Code Playgroud)

应该管用.如果没有,您可能需要更改本地设置.

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

echo "Â10.41.89.50 " | sed "s/[^[:digit:].-]//g"
Run Code Online (Sandbox Code Playgroud)

如果你的字符串在变量中,你可以使用纯bash和参数扩展:

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[^[:digit:].-]/}
$ echo "$clean"
10.41.89.50
Run Code Online (Sandbox Code Playgroud)

要么

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[[:alpha:]]/}
$ echo "$clean"
10.41.89.50
Run Code Online (Sandbox Code Playgroud)

你也可以看看1_CR答案.


anu*_*ava 5

好的sed不支持unicode字符.perl改为使用:

> s="Â10.41.89.50 "
> perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50
Run Code Online (Sandbox Code Playgroud)