所以,也许我应该用grep
这个。只要我需要递归搜索,我就应该使用grep -r
.但我不知道接下来我应该做什么;)
我怎样才能做到这一点?
答案1
使用grep
支持-r
(递归)和-P
(PCRE)选项的 s(或pcregrep
使用-r
):
grep -rP '^(?=.{101}).*?if' .
或者 POSIXly:
find . -type f -exec awk 'length > 100 && /if/ {
print FILENAME ": " $0}' {} +
(请注意,非文本文件(包含非字符、零字节值、太长的行或最后一个换行符后的数据的文件)的实现之间的行为会有所不同。另请注意,某些grep
实现将在非常规文件中搜索或将遵循符号链接)。
答案2
使用 awk 计算 $0 的大小和子字符串的存在 if?
awk '( length($0) > 100 && index($0,"if") ){print}' file
如果“if”应该是一个单词(而不是一个简单的子字符串),您可以使用
awk '( length($0) > 100 && match($0,/\<if\>/) ){print}' file
答案3
您可以使用通过管道连接的两个 grep:
grep -r '.\{100\}' /path | grep 'if'
要排除if
路径或名称中包含的文件,请使用':.*if'
代替'if'
(如果文件名或路径包含冒号,仍然可能会中断)。
答案4
与一个grep
:
grep -vxE '.{0,99}|([^i]|i[^f])*i*' <in >out
只会选择无法用任一语句从头到尾描述的行。因此,任何可以被描述为由 0 到 99 个字符组成的行都不会被选择,同样,任何匹配超过 99 个字符但仍然不包含至少一个字符的行如果也会被选中失败。
printf '^%-100b$\n' 'if\nif' 'hey if' i if |
grep -nvxE '.{0,99}|([^i]|i[^f])*i*'
3:^hey if $
5:^if $
不过,使用两个grep
s 可能会更好。