我想从一行中捕获特殊字符:
var=`echo "#this is comment" | grep "[^a-zA-Z0-9 \t]"`
echo $var
预期输出:#
但是得到:#this is comment
有人可以帮我吗。
似乎您想要更多类似的东西:
var=`echo "#this is comment" | sed 's/[^a-zA-Z0-9 \t]//g;'`
使用sed
将替换字符;usinggrep
只是搜索字符。
编辑:请注意,\t
不保证该构造可移植到所有系统或语言环境;我相信如果您sed
支持 POSIX 正则表达式,使用[:space:]
可能会更好。(感谢@ghoti!)
string="#this is comment"
var=$(echo "$string" | sed 's/[a-zA-Z0-9 ]//g')
echo "$var"
我已经删除\t
了,因为它不便携。
如果您想使用 awk 执行此操作,如您的标签所示,您可以使用以下内容:
var=$(echo "$string" | awk '{gsub(/[a-zA-Z0-9 ]/, "")} 1')
请注意,这些可能不是实现您想要做的任何事情的好方法。如果您发布更多代码,向我们展示一些上下文,我们可以帮助您避免XY 问题。
当然,如果您愿意,您也可以直接在 bash 中进行这样的替换。
var=${string//[A-Za-z0-9 ]}
通过避免在您真的不需要时调用额外的程序,您将节省 CPU 和时间。
sed
可以用于此,但tr
更好的选择:
echo "#this is comment" | tr -d 'a-zA-Z0-9 \t'
tr
还支持字符类,例如[:space:]
和[:alpha:]