如何使用grep命令筛选包含[form]且不含[head]或[cfGenerate]的文件
筛选包含[form]但排除[head]/[cfGenerate]的文件内容
没问题,这事儿用grep就能轻松搞定,我给你几个实用的命令方案,按需选择:
方案1:管道组合(兼容性最好)
这是最通用的写法,几乎所有系统的grep都支持:
# 递归搜索当前目录下所有包含[form]的行,再排除掉包含[head]或[cfGenerate]的行 grep -r "\[form\]" . | grep -v "\[head\]" | grep -v "\[cfGenerate\]"
要是想简化排除逻辑,可以用扩展正则表达式一次排除多个关键词:
grep -r "\[form\]" . | grep -v -E "\[head\]|\[cfGenerate\]"
参数解释:
-r:递归遍历当前目录(.)下的所有文件\[form\]:因为[和]是正则的特殊字符,必须加反斜杠转义才能匹配字面的[form]-v:反向匹配,也就是排除符合后面模式的行-E:启用扩展正则,允许用|分隔多个要排除的关键词
方案2:固定字符串模式(不用转义更省心)
如果你只是要匹配字面的[form]这类字符串,不想处理正则转义,可以用-F选项(固定字符串匹配):
grep -rF "[form]" . | grep -vF -E "[head]|[cfGenerate]"
-F会把所有模式当作普通字符串,不用再给[/]加反斜杠,写起来更顺手。
方案3:单grep命令(需GNU grep支持)
如果你的系统是GNU grep(比如Linux),可以用PCRE正则一次性完成匹配和排除,不需要管道:
grep -r -P "(?=\[form\])(?!.*\[head\])(?!.*\[cfGenerate\])" .
这里用到了正则的预查语法:
(?=\[form\]):确保行内包含[form](?!.*\[head\]):确保行内不包含[head](?!.*\[cfGenerate\]):确保行内不包含[cfGenerate]
如果你只需要显示符合条件的文件名而非具体内容行,可以给命令加-l选项调整(比如grep -rl "\[form\]" . | xargs grep -v -lE "\[head\]|\[cfGenerate\]"),按需使用即可。
内容的提问来源于stack exchange,提问作者KekoSha
相关产品推荐
相关产品推荐

