我可以在 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
保持简单并记住俗话说:
有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。