我正在尝试验证一些输入以删除一组字符.只允许使用字母数字字符加,句号,下划线,连字符.我[^\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
TR的-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答案.
好的sed不支持unicode字符.perl改为使用:
> s="Â10.41.89.50 "
> perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50
Run Code Online (Sandbox Code Playgroud)