[英]Need to exclude and match regex in bash
我是 bash 的新手,正在尝试编写一个脚本来搜索代码库中的某些特定单词。 但是因为有很多误报,我还需要维护一个 exclude_pattern 列表,以便忽略任何匹配的内容目前我的脚本正在返回正确的匹配项,相关行看起来像这样
output=$(find $sourceDir -path "*/.git" -prune -o -type f \( -name "*.cpp" -o -name "*.h" \) -exec grep -E -H -i -R --color=always "$matching_regex" {} \; )
现在我无法使用这个 output 并在其上运行排除模式我试图做这样的事情但它没有用
while IFS= read -r line do foundFinal=$(grep -v "$exclude_matches" "$line") done <<< "$output"
也许我不需要单独执行排除部分,但我可以在第一个命令本身中进行匹配和排除,但到目前为止我还没有成功。 如果我能得到任何反馈或例子来告诉我我可能遗漏了什么或做错了什么,那就太好了。 顺便说一句,我是 bash 的新手,所以如果 grep 不是我用例的命令,请不要犹豫发表评论。
output=$( find "$sourceDir" \ -name.git -prune \ -o \ -type f \( -name '*.cpp' -o -name '*.h' \) \ -exec grep -E -H -i -- "$matching_regex" {} + ) foundFinal=$( grep -E -v "exclude_matches" <<<"$output" )
或者更有效地,如果您不需要output
,只需 pipe 两者一起:
foundFinal=$( find "$sourceDir" \ -name.git -prune \ -o \ -type f \( -name '*.cpp' -o -name '*.h' \) \ -exec grep -E -H -i -- "$matching_regex" {} + \ | grep -E -v -- "$exclude_matches" )
\;
用+
减少grep
的调用次数-R
(无论如何都不应该成功)--color==always
可能会干扰第二个 grep-E
添加到第二个 grep 以匹配第一个--
以防止以连字符开头的正则表达式如果要着色以进行显示,可以在(可能不会太长)结果上重新运行 grep:
grep --colour=auto -E -i -- "$matching_regex" <<<"$foundFinal"
假设matching_regex.txt
包含您想要包含的所有正则表达式,并且exclude_matches.txt
包含您想要排除的所有正则表达式。
尝试:
find $sourceDir -path "*/.git" -prune -o -type f\ \( -name "*.cpp" -o -name "*.h" \)\ -exec grep -E -H -i --color=always -f matching_regex.txt {} + | grep -E -i -v -f exclude_matches.txt
使用 xargs 和 GNU Awk(未经测试)
# get files find "$sourceDir" -name.git -prune -o \ -type f \( -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 \ # piping find result (filenames) to awk awk -v mc="$match_regex" -v ex="$exclude_matches" ' # filter matches and excludes match($0,mc) &&, match($0,ex) # display only line no filename # or --> match($0,mc) &&, match($0 ex){print FILENAME $0}' # display filename && line '
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.