LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: edwardhayes

正则表达式的一个问题。[基本解决]

[复制链接]
 楼主| 发表于 2004-6-18 09:46:24 | 显示全部楼层
单引号的目的是为了圈定pattern对吧。
比如grep Edward Hayes text.xls
这样就会出现问题。
如果写成grep 'Edward Hayes' text.xls就可以将text.xls有Edward Hayes的语句选出来。
但是,我不明白的是为什么[ns]a[0-9]\.xls这样的pattern也需要加单引号圈定嘛?
应该是可选啊!
发表于 2004-6-18 10:29:23 | 显示全部楼层
在grep中,查找模式可以用单引号,双引号,来括引,也可以不用引号
当模式包含有元字符或变量的时候,通常用双引号,而不可以用单引号.
如:
/home/lee/test#a=ca
/home/lee/test#grep $a txt  #这里的$a,替换后是ca
ca1.xls
/home/lee/test#grep '$a' txt #单引号把变量$a直接解释成了$a,而不是ca
/home/lee/test#echo $?     #失败
1
/home/lee/test#grep "$a" txt
ca1.xls
/home/lee/test#
不明白的是为什么[ns]a[0-9]\.xls这样的pattern也需要加单引号圈定嘛

在linux里不需要!,当然,你用的cygwin,也许需要
/home/lee/test#cat txt|grep [ns]a[0-9]\.xls
na1.xls
na2.xls
sa1.xls
/home/lee/test#cat txt|grep '[ns]a[0-9]\.xls'
na1.xls
na2.xls
sa1.xls
/home/lee/test#cat txt|grep "[ns]a[0-9]\.xls"
na1.xls
na2.xls
sa1.xls
/home/lee/test#cat txt|grep [ns]a[0-9].xls  #这里的.不需要转义
na1.xls
na2.xls
sa1.xls
 楼主| 发表于 2004-6-18 10:48:09 | 显示全部楼层
明白了一些,谢谢解答的兄弟!
发表于 2004-6-18 11:23:00 | 显示全部楼层
1) 加不加单引号与 Linux 没有关系, 这是由各种 shell 的语法
2) cygwin 的 bash 跟 linux 的 bash 几乎是一样的, 至少在语法上没有区别
发表于 2004-6-18 11:30:14 | 显示全部楼层
look:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2004-6-18 12:48:49 | 显示全部楼层
我的cygwin就是不行。不理它了。
结果就是这样。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-6-18 13:39:35 | 显示全部楼层
我来说两点吧。我发现这类问题老是被提出。

1.请参阅置顶帖的命令行处理,自得其法。
shell各种语法现象万变不离其宗,看问题要抓核心。

2..对于bash而言并不是什么特殊字符(元字符那一套对于bash不管用),它在命令行处理中并不发生任何变化。bash只负责把命令行处理后的字符串作为参数传递给命令,这里是grep。
ps:\反斜杠和''单引号等价,都跳过前十个命令行处理的步骤。

至于为什么cygwin会发生这类现象,估计和它的bash有关。其实,发行版本自带的bash的确会有所不同,比如说debian的bash就是一个典型例子。
个人认为,没必要纠缠于标准兼容的问题;我们选择Linux,最好选正统的发行版本,如debian。cygwin这类奇怪的变种,还是少用为妙。
发表于 2004-6-18 21:11:28 | 显示全部楼层
看来大家都没有明白问题之所在. 命令 ls | grep [ns]a[0123456789]\.xls 执行时, 由于没有加引号, bash 先进行 filename expansion, 将其中的 [ns]a[0123456789]\.xls 替换为 na1.xls na2.xls sa1.xls, 因此上述命令跟 ls | grep na1.xls na2.xls sa1.xls 是相同的, 而 grep 将 na1.xls 解释为模式串, 将 na2.xls 和 sa1.xls 都当做要查找的文件, 也就是说在 na2.xls 和 sa1.xls 两个文件中查找 "na1.xls", 所以此时的 ls | 根本不起作用, 结果就可想而知了.
发表于 2004-6-18 21:13:59 | 显示全部楼层
至于我的 grep.jpg 中的效果, 其实也简单, 我在 na2.xls 和 sa1.xls 这两个文件中都加了字符串 "na1.xls", 呵呵, 后面就不用我再解释了吧:p
发表于 2004-6-18 21:17:00 | 显示全部楼层
just look at this:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表