1

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

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

预期输出:#

但是得到:#this is comment

有人可以帮我吗。

4

3 回答 3

3

似乎您想要更多类似的东西:

var=`echo "#this is comment" | sed 's/[^a-zA-Z0-9 \t]//g;'`

使用sed将替换字符;usinggrep只是搜索字符。

编辑:请注意,\t不保证该构造可移植到所有系统或语言环境;我相信如果您sed支持 POSIX 正则表达式,使用[:space:]可能会更好。(感谢@ghoti!)

于 2012-08-16T01:37:38.280 回答
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 问题

当然,如果您愿意,您也可以直接在 bash 中进行这样的替换。

var=${string//[A-Za-z0-9 ]}

通过避免在您真的不需要时调用额外的程序,您将节省 CPU 和时间。

于 2012-08-16T01:42:08.073 回答
0

sed可以用于此,但tr更好的选择:

echo "#this is comment" | tr -d 'a-zA-Z0-9 \t'

tr还支持字符类,例如[:space:][:alpha:]

于 2012-08-16T12:46:12.517 回答