【发布时间】:2011-09-27 01:45:53
【问题描述】:
我必须更改模板目录的路径,并且我想确保我的所有文件都引用“templates/app/xxx.html”而不是“templates/xxx.html”
如何使用 grep 来查看“*.html”的所有行,而不是“app/*.html”?
【问题讨论】:
标签: regex unix command-line grep
我必须更改模板目录的路径,并且我想确保我的所有文件都引用“templates/app/xxx.html”而不是“templates/xxx.html”
如何使用 grep 来查看“*.html”的所有行,而不是“app/*.html”?
【问题讨论】:
标签: regex unix command-line grep
假设每行只有一个,您可以从以下内容开始:
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 会失败
grep 将其通过,第二个根据需要将其剥离。但即使它没有正常工作,这就是我的答案中“取决于你的台词有多棘手”的部分。
...foo/bar/app/blah/x.html。你从 ` echo "...foo/bar/app/blah/x.html"| 得到什么输出? grep '\.html' | grep -v '/app/.*\.html' `?
.html)并被第二个过滤器拒绝(因为它有/app/XXX.html,其中XXX 是任何东西)。
...foo/bar/app/blah/x.html 应该显示在结果中。换句话说,我们需要那条线。只有路径“..../app/*.html”应该被过滤掉,但“../app/../../../*.html”不是。
了解哪些文件包含对旧路径的不需要的引用也可能很有用。
我会做这样的事情(免责声明:未经测试!但我从 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'的东西。剩下的是需要修复的行列表,以及找到它们的文件名。
【讨论】:
...foo/bar/app/blah/x.htm
或
使用这个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 将被匹配。
【讨论】: