首先,我尝试以下代码
find . -name "*.cfg" | xargs grep "good"|grep -v "^\#"
在当前文件夹中,我得到文件名扩展名为“cfg”的列表。然后我想搜索内容以查找包含“good”但不以“#”开头的行。但我的代码不起作用。有什么不对?谢谢。
答案1
无用的 xargs 使用(如果你的 find 有 -exec):
find . -name "*.cfg" -exec egrep "^[^#]*good" {} +
插入符号不需要被屏蔽 - 我不知道在什么情况下它必须被屏蔽。但这没有什么害处,你的整个命令对我有用。
答案2
像下面这样的东西应该有效:
find . -name "*.cfg" -print0 | xargs -0 grep -E '^([^#].*|)good'
请注意,我切换到-print0
以避免文件名包含空格的问题。
然后我过滤包含good
但不以#
单个正则表达式开头的行。左侧替代 ( [^#].*
) 匹配以非字符开头的行#
,右侧替代(空)允许匹配以 开头的行good
。
使用单个正则表达式,而不是您问题中的两个正则表达式,允许我们让 GNU grep 打印文件名(如果 提供了多个文件,它将执行此操作find
)。添加grep -v ^...
第二步将无法匹配文件行的开头。