|
发表于 2008-2-10 09:26:42
|
显示全部楼层
Post by casio1374633;1813870
回10楼.我从新看了下鸟哥的(正规表达法)这个章节.
首先,正规表达法不是一个工具(那么可以说应该不是sh),如果想用正规表达法,那么也要使用具备正规表达法的工具才行(那么rm不是具备正规表达法的工具,而grep,vi,sed,awk是具备的,所以可以用).
另外在下面看到说<注意:正规表达法和万用字符是不一样的.因为万用字符和正规表达法表示的内容是不一样的.要分清出>
那么我大概可以知道,我之所以犯错是因为我把正则表达法和万用字符搞混淆了.
也就是7楼的朋友说的<globbing is NOT RE, ok?>是这个意思吧?
请问remote fish朋友,我这么说是否正确?
抱歉这么多天才回复, 过年真是累啊;)
关于谁来扩展, 这不取决于执行的命令自身是否支持扩展, 而是取决于形式. 一个实际的例子是:
假如当前目录下有 a.c 文件, b/ 目录, b/c.c 文件, 然后我们用 find . -name *.c 进行查找的时候, sh 会对命令进行扩展, 成为 find . -name a.c, 那么此命令就只能找到 a.c 文件. 而若我们将命令改成 find . -name '*.c', 这时候就不再由 sh 进行扩展, 而由 find 自行处理 *.c , 那么就可以找到 a.c, b/c.c 两个文件. 另外如果当前目录下没有 a.c 文件, 那么 sh 扩展不成功, 就会把 '*.c' 原封不动地传递给 find.
现在回到楼主的问题, *~$ 这样的是 grep 兼容的正则表达式, 而在 sh 中 $ 是作为变量的标志符出现的. rm *~$ 正是由 sh 进行扩展的, 所以联系上面的讨论, 我们就可以理解结果为什么是这个样子的了.
下面来说一下如何通过 grep 兼容的正则表达式来利用 rm. 我们知道 rm 不支持从标准输入读入文件名, 它只支持参数的形式, 而 sh 本身的命令扩展又不是正则表达式, 那么我们该如何实现以下目的呢?
* 根据正则表达式来过滤文件名
* 把这些文件名传给 rm
其实这二者都不难. 看以下两个命令
- rm $( echo * | grep '^abc.*' )
- echo * | grep '^abc.*' | xargs rm
复制代码
第一个是通过 sh 自身的能力, 将命令的输出当作参数进行传递, 而第二个则是利用了 xargs 这样的专门通过管理构建参数的工具.
祝新春快乐! |
|