确保grep中的文件路径已完成

时间:2011-09-27 01:45:53

标签: regex unix command-line grep

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

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

3 个答案:

答案 0 :(得分:2)

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

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

第一个将提供所有.html的人。第二个会从列表中删除所有拥有app变体的人,只留下违反支票的人。

显然,这可能需要调整,具体取决于你的线路是多么棘手(每行不止一个,线路上的其他东西等等)但是这个“给我一个列出所有可能的违规行为然后删除那些“违规行为”是一种久经考验的方法。

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

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

使用[^/]*(任意数量的非/字符)代替.*(任意数量的字符,包括/)将留在那些没有将HTML文件直接放在app目录中。

答案 1 :(得分:0)

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

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

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

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

对于每个文件,grep运行时带有两个文件参数:{}表示目标路径,/dev/null表示grep为匹配行添加前缀它出现的文件名。从那里,我们删除了匹配'/app/.*\.html'的任何内容。剩下的是需要修复的行列表,以及找到它们的文件名。

答案 2 :(得分:0)

或 使用此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