我正在尝试验证一些输入以删除一组字符。只允许使用字母数字字符加,句号,下划线,连字符。我已在此处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.-]//g
和echo "Â10.41.89.50 " | sed s/[\w^.-]//g
返回Â10418950
我尝试了Skip/remove non-ascii character with sed中找到的答案,但没有删除任何内容。
答案 0 :(得分:43)
tr的-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"