我想从一行中捕捉特殊字符:
var=`echo "#this is comment" | grep "[^a-zA-Z0-9 \t]"`
echo $var
预期输出:#
但得到:#this is comment
有人可以帮助我。
答案 0 :(得分:3)
似乎你想要更像的东西:
var=`echo "#this is comment" | sed 's/[^a-zA-Z0-9 \t]//g;'`
使用sed
将替换字符;使用grep
只搜索字符。
编辑:请注意,\t
构造不能保证可移植到所有系统或区域设置;我相信如果您的sed
支持POSIX正则表达式,使用[:space:]
可能会更好。 (谢谢@ghoti!)
答案 1 :(得分:2)
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 problem。
当然,如果你愿意的话,你也可以直接在bash中进行这样的替换。
var=${string//[A-Za-z0-9 ]}
当你不需要额外的程序时,你可以通过避免调用额外的程序来节省CPU和时间。
答案 2 :(得分:0)
sed
可用于此目的,但tr
是更好的选择:
echo "#this is comment" | tr -d 'a-zA-Z0-9 \t'
tr
还支持[:space:]
和[:alpha:]