为什么 grep 可以得到每行的最小字符数而不是最大字符数?

为什么 grep 可以得到每行的最小字符数而不是最大字符数?

我可以在 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

保持简单并记住俗话说

有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

相关内容