我试图对名称与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
工作正常。我也试过在双引号和引号内传递参数但是对我来说都不起作用。 你对如何解决这个问题有任何想法吗?
答案 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
附近加上双引号。