如何在模式文件上调用grep?

时间:2015-01-17 22:27:54

标签: regex linux bash grep sh

我试图对名称与regexp匹配的文件进行grep。但是接下来:

#!/bin/bash
grep -o -e "[a-zA-Z]\{1,\}"  $1 -h --include=$2 -R

仅在某些情况下有效。当我这样调用这个脚本时:

./script.sh dir1/ [A-La-l]+

它没有用。但是接下来:

./script.sh dir1/ \*.txt

工作正常。我也试过在双引号和引号内传递参数但是对我来说都不起作用。 你对如何解决这个问题有任何想法吗?

1 个答案:

答案 0 :(得分:2)

grep的{​​{1}}选项不接受正则表达式,而是接受全局(例如--include),它的功能相当低。您必须决定是否要匹配正则表达式或全局 - *.txt不是有效的正则表达式(等效正则表达式为*.txt),而.*\.txt不是有效的glob。

如果您想使用正则表达式执行此操作,则无法单独使用[A-La-l]+执行此操作。您可以做的一件事是将文件选择保留为其他工具,例如grep

find

这将构造并运行命令find "$1" -type f -regex "$2" -exec grep -o -e '[a-zA-Z]\{1,\}' -h '{}' + 。如果将grep -o -e '[a-zA-Z]\{1,\}' -h list of files in $1 matching the regex $2替换为+,它将分别为每个文件运行命令,这会产生相同的结果(非常)稍慢一点。

如果你想用globs做,你可以像以前一样继续;你的代码已经做到了。不过,您应该在\;$1附近加上双引号。