![为什么 grep 可以得到每行的最小字符数而不是最大字符数?](https://linux22.com/image/166917/%E4%B8%BA%E4%BB%80%E4%B9%88%20grep%20%E5%8F%AF%E4%BB%A5%E5%BE%97%E5%88%B0%E6%AF%8F%E8%A1%8C%E7%9A%84%E6%9C%80%E5%B0%8F%E5%AD%97%E7%AC%A6%E6%95%B0%E8%80%8C%E4%B8%8D%E6%98%AF%E6%9C%80%E5%A4%A7%E5%AD%97%E7%AC%A6%E6%95%B0%EF%BC%9F.png)
我可以在 Mac 上的 Bash 中执行此操作:
grep ".\{81,\}" foo.txt
要获取文件中包含 81 个或更多字符的所有行foo.txt
,并使用:
grep -v ".\{81,\}" foo.txt
获取所有不超过 80 个字符的行。 (-v
“相反”)
但如果我使用
grep ".\{,81\}" foo.txt
它会说grep: invalid repetition count(s)
。
如果我使用
grep ".\{0,81\}" foo.txt
无论长度如何,它都会给出所有行。
如何使上述最后两种形式发挥作用?它们遵循正则表达式形式
.{,80}
表示 80 个或更少的任意数量的字符。
答案1
grep ".\{0,81\}" foo.txt
任何行都将与此匹配。如果行有 82 个字符,则它也有 81 个字符。您需要:
- 将正则表达式包装在
^
and中$
,以便从行首到行尾有 0 到 81 个字符,或者 - 用于
-x
指定该行必须与此正则表达式完全匹配(相当于上面的选项)
所以:
grep "^.\{0,81\}$" foo.txt
grep -x ".\{0,81\}" foo.txt
答案2
在每个 UNIX 机器上的任何 shell 中使用任何 awk:
$ printf 'abcdef\nABC\n' | awk 'length($0) > 3'
abcdef
$ printf 'abcdef\nABC\n' | awk 'length($0) < 3'
$
$ printf 'abcdef\nABC\n' | awk 'length($0) <= 3'
ABC
保持简单并记住俗话说:
有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。