我有一个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-rUS
或xml
后跟任意数量的字符。有人能告诉我哪里出错了吗?
答案 0 :(得分:2)
我假设你在bash环境中工作过。
您已使用extend globbing
,因此必须首先打开它:
shopt -s extglob
对于您的任务,您不必将grep
和find
合并,您可以这样做:
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" --