【问题标题】:find and then grep and then iterate through list of filesfind 然后 grep 然后遍历文件列表
【发布时间】:2016-02-26 18:23:17
【问题描述】:

我有以下脚本来替换文本。

grep -l -r "originaltext" . |  
while read fname  
do  
sed 's/originaltext/replacementText/g' $fname > tmp.tmp  
mv tmp.tmp $fname  
done

现在在这个脚本的第一条语句中,我想做这样的事情。

find . -name '*.properties' -exec grep "originaltext" {} \;

我该怎么做?
我在 AIX 上工作,所以 --include-file 不起作用。

【问题讨论】:

    标签: unix grep find sh aix


    【解决方案1】:

    一般来说,我更喜欢使用find 来查找文件而不是grep。看起来很明显:)

    使用process substitution,您可以将find 的结果提供给while 循环:

    while IFS= read -r fname  
    do  
      sed 's/originaltext/replacementText/g' $fname > tmp.tmp  
      mv tmp.tmp $fname  
    done < <(find . -name '*.properties' -exec grep -l "originaltext" {} \;)
    

    注意我使用grep -l(大L),所以grep只返回匹配模式的文件名。

    【讨论】:

    • 嘿,fedorqui,看起来文件管理器“*.properties”似乎无法正常工作。如果我在循环中回显 fname,我看不到属性文件
    • @Ahmad 我并没有真正遵循您的目的。由于您使用find ... -exec grep,您可能想说grep -l(即小写L),以便它只提供文件名作为输出。
    【解决方案2】:

    您可以反过来,将“*.properties”文件列表提供给 grep。例如

    grep -l "originaltext" `find -name '*.properties'`
    

    哦,如果您使用的是最近的 linux 发行版,那么 grep 中有一个选项可以实现这一目标,而无需创建长长的文件列表作为参数

    grep -l "originaltext" --include='*.properties' -r .
    

    【讨论】:

    • 第一个不起作用,正如我已经提到的,第二个选项对我不可用。还是谢谢你的回答
    • 糟糕,没有读到最后一行,抱歉。仔细阅读 fedorqui 的回答。
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多