从线上捕捉特殊字符

时间:2012-08-16 01:34:49

标签: regex bash awk grep

我想从一行中捕捉特殊字符:

var=`echo "#this is comment" | grep "[^a-zA-Z0-9 \t]"`
echo $var

预期输出:#

但得到:#this is comment

有人可以帮助我。

3 个答案:

答案 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:]

等字符类