【问题标题】:Making sure a file path is complete in grep确保 grep 中的文件路径完整
【发布时间】:2011-09-27 01:45:53
【问题描述】:

我必须更改模板目录的路径,并且我想确保我的所有文件都引用“templates/app/xxx.html”而不是“templates/xxx.html”

如何使用 grep 来查看“*.html”的所有行,而不是“app/*.html”?

【问题讨论】:

    标签: regex unix command-line grep


    【解决方案1】:

    假设每行只有一个,您可以从以下内容开始:

    grep '\.html' | grep -v '/app/.*\.html'
    

    第一个将提供所有具有.html 的人。第二个将从该列表中删除所有具有app 变体的内容,只留下那些违反您检查的内容。

    显然,这可能需要根据您的线路的棘手程度(每行不止一个,线路上的其他内容等等)进行调整,但这“给我一个所有可能违规的列表,然后删除那些“不违反”是一种久经考验的方法。

    例如(正如 Kent 建议的那样),您可能希望确保 HTML 文件都直接app 目录中,而不是可能在 app/something/xyzzy.html 中。在这种情况下,您可以简单地调整您的第二个过滤器以确保:

    grep '\.html' | grep -v '/app/[^/]*\.html'
    

    使用[^/]*(任意数量的非/ 字符)而不是.*(任意数量的字符,包括/)将留在那些没有直接在@ 中包含HTML 文件的文件中987654331@目录。

    【讨论】:

    • 如果像 ...foo/bar/app/blah/x.html 这样的链接你的 grep 会失败
    • @Kent,我不认为你是对的。我的第一个 grep 将其通过,第二个根据需要将其剥离。但即使它没有正常工作,这就是我的答案中“取决于你的台词有多棘手”的部分。
    • 我没有说你的答案是完全错误的。并且您的“取决于您的台词有多棘手”确实有意义。我只是说,你的 grep 行不能匹配 ...foo/bar/app/blah/x.html。你从 ` echo "...foo/bar/app/blah/x.html"| 得到什么输出? grep '\.html' | grep -v '/app/.*\.html' `?
    • @Kent:我什么也没得到。如前所述,它通过了第一个过滤器(因为它有.html)并被第二个过滤器拒绝(因为它有/app/XXX.html,其中XXX 是任何东西)。
    • 是的,我认为...foo/bar/app/blah/x.html 应该显示在结果中。换句话说,我们需要那条线。只有路径“..../app/*.html”应该被过滤掉,但“../app/../../../*.html”不是。
    【解决方案2】:

    了解哪些文件包含对旧路径的不需要的引用也可能很有用。

    我会做这样的事情(免责声明:未经测试!但我从 paxdiablo 复制了一些,所以那部分可能是正确的。)

    find /path/to/files_to_check -type f -name "*.html" -exec grep '\.html' {} \; /dev/null | grep -v '/app/.*\.html'
    

    find 命令在目录层次结构中搜索名称以.html 结尾的常规文件。根据您的情况进行调整。

    对于这些文件中的每一个,grep 使用两个文件参数运行:{} 代表目标路径,/dev/nullgrep 在匹配行前加上它出现的文件名。从那,我们去掉任何匹配'/app/.*\.html'的东西。剩下的是需要修复的行列表,以及找到它们的文件名。

    【讨论】:

    • 与paxdiablo的解决方案相同,不适用于路径...foo/bar/app/blah/x.htm
    【解决方案3】:

    或 使用这个grep -P '(?<!/app)/[^/]*\.html

    测试:

    kent$  echo ".../app/a/b/x.html
    .../foo/myapp/y.html
    .../foo/app/z.html"|grep -P '(?<!/app)/[^/]*\.html'
    
    .../app/a/b/x.html
    .../foo/myapp/y.html
    

    请注意,这将忽略..../app/*.html,但.../myapp/*.html.../app/foo/x.html 将被匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 2012-03-29
      • 2011-06-22
      • 1970-01-01
      相关资源
      最近更新 更多