查找命令中的全局

时间:2014-05-04 10:50:03

标签: regex grep find glob

我有一个Android项目,我根据语言和其他标准在不同的地方定义了strings.xml和其他.xml文件。

有目录如 -

> /res/values-en-rUS/strings.xml 
> /res/values-es-rUS/strings.xml
> /res/values-fi/strings.xml 
> /res/values-it/strings.xml
> /res/values-ms/strings.xml 
> /res/values-bn/strings.xml
> /res/values-da/strings.xml
> /overlay_dir/TN_KOR_COMMON/res/values/strings.xml
> /overlay_dir/TN_KOR_COMMON/res/values-en-rUS/strings.xml
> /overlay_dir/TN_KOR_COMMON/res/values-ko/strings.xml
> /overlay_dir/TN_JPN_COMMON/res/values-ja/strings.xml
> /res/layout/hovering.xml
> /res/xml/settings_menu.xml

现在,我想在只有/res/values-en-rUS/res/xml等路径的目录中的文件中找到一个字符串。
我使用了命令 -

grep -i "hovering_msg" `find -path "*@(values-en-rUS|xml)*" -iname "*.xml"`

但它似乎不起作用。根据我的理解*@(values-en-rUS|xml)*"表示找到一些字符后跟values-en-rUSxml后跟任意数量的字符。有人能告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分:2)

我假设你在bash环境中工作过。 您已使用extend globbing,因此必须首先打开它:

shopt -s extglob

对于您的任务,您不必将grepfind合并,您可以这样做:

grep -i 'pattern' /res/@(values-en-rUS|xml)/*.xml

对于源代码搜索,我推荐ag(银色搜索者)。

答案 1 :(得分:1)

对于具有-path-regex的目录部分进行模式匹配也是可能的,但是仅指定两个目标目录比尝试匹配模式更简单。这样可以节省执行时间,因为它不会尝试搜索其他目录中的文件。

find /res/values-en-rUS /res/xml -iname '*.xml'

使用grep

grep -i "hovering_msg" `find /res/values-en-rUS /res/xml -iname '*.xml'`

除了使用反引号分割命令替换的输出外,还可以使用管道中的while read来允许文件名中的空格:

find /res/values-en-rUS /res/xml -iname '*.xml' | while read file; do
    grep -i "hovering_msg" "$file"
done

如果你在Linux机器中,使用xargs将是更好的选择:

find /res/values-en-rUS /res/xml -iname '*.xml' -print0 | xargs -0 -d '\n' -- grep -i "hovering_msg" --