zoukankan      html  css  js  c++  java
  • 解决grep的结果无法显示文件名的问题

    有时候想在代码中执行某个关键词,会用下面的语句:

    find . -type f -name "*.java" | xargs grep -n "<keyword>"

    大部分情况下良好,但也有出问题的时候,比如某个目录中含有空格。那么检索这个目录下所有的文件都会报错。为此,需要改一下脚本,将路径放到引号中。

    find . -type f -name "*.java" | xargs -I {} grep -n "<keyword>" "{}"

    这样又出现了新的问题:结果中都没有命中文件的文件名了。只有行号和命中行的内容。像下面这样:

    :123   public class xxxxxx...

    没错,我用的是 cygwin. 上面的命令在 linux 下是没有问题的。但在 cygwin 下不行。即使在find中加上 -print 也无济于事。

    不过,用另一个参数可以解决这个问题,即 print0,脚本如下:

    find . -type f -name "*.java" -print0 | xargs -0 grep -n "<keyword>"

    xargs -0 大意是让输入项以 作为分隔,而不是以空白符号。-print0 和 -0 配合使用。带空格的路径再不会被当作多个输入项了。

    接下来考虑完善这个命令,如果想同时检索以 .java, .xml, .jsp 等结束的文件。该怎么办叫做?

    find . -type f -name "*.java" -print0 -o -name "*.xml" -print0 -o -name "*.jsp" -print0 | xargs -0 grep -n "<keyword>"

    然后在 .bashrc 中给这个命令起个别名:

    alias grepj='find . -type f -name "*.java" -print0 -o -name "*.xml" -print0 -o -name "*.jsp" -print0 | xargs -0 grep -n'

    命名就简化成 grepj keyword,这样就完美了。

    注意每一个检索条件后都要跟一个 -print0 参数。

  • 相关阅读:
    U盘引导Linux安装 CentOS .3
    Linux CentOS 6.3 网络连接 修复 虚拟机共享主机网络
    内存中“堆”和“栈”的区别
    求助帖--C++中单引号' '内多个字符是什么意思
    Cent Os6.3 设置中文输入法
    WPF中调用matlab制作的dll进行图像处理
    Python中的round()函数原理
    Eclipse+Pydev环境搭建
    5-4-shell:数组
    5-3-shell:流程控制--判断循环
  • 原文地址:https://www.cnblogs.com/qkhh/p/4596952.html
Copyright © 2011-2022 走看看