awk正则表达式中的空白字符

sh/bash/dash/ksh/zsh等Shell脚本
回复
shmily623
帖子: 64
注册时间: 2009-07-02 19:11
送出感谢: 0
接收感谢: 0

awk正则表达式中的空白字符

#1

帖子 shmily623 » 2011-04-30 20:27

查找一行中的纯数字行(可以包括空格)
cat a

1 2 x
a b 1 2 f
2 3 4
23
上面 的空白全是空格
用grep '^\s*\([0-9]\s*\)*$' a,输出
2 3 4
23
结果正确
用awk '/^\s*([0-9]\s*)*$/' a,输出
23
漏掉了 2 3 4
用awk '/^ *([0-9] *)*$/' a (把\s用空格换掉)
输出

2 3 4
23
结果正确。
这是什么原因?难道在awk中\s不是表示所有的空白字符吗?
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30
送出感谢: 2 次
接收感谢: 31 次

Re: awk正则表达式中的空白字符

#2

帖子 aerofox » 2011-04-30 22:11

好像不认 \s 吧,从 manpage 中没有找到,但是肯定是认 [:space:] 的。

代码: 全选

awk '/^[[:digit:][:space:]]+$/' a
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
送出感谢: 2 次
接收感谢: 3 次
联系:

Re: awk正则表达式中的空白字符

#3

帖子 sk1418 » 2011-05-03 12:59

awk 使用 ERE, ERE里没有\s \S
不知道你grep是不是alias,如果就是默认的grep,它是使用BRE, 你可以试试grep -E ,让它使用ERE,输出也应该不正确。
sed也是一样,默认使用BRE,
sed -n '/^\s*\([0-9]\s*\)*$/p' t.txt
应该输出正确。
但是如果你使用ERE: sed -nr '/^\s*\([0-9]\s*\)*$/p' t.txt 输出又该不正确了。

我没测试,你自己试试。
---
regards,

Kent
shmily623
帖子: 64
注册时间: 2009-07-02 19:11
送出感谢: 0
接收感谢: 0

Re: awk正则表达式中的空白字符

#4

帖子 shmily623 » 2011-05-03 16:56

我的grep
alias grep='grep --color=auto'
回复

回到 “Shell脚本”