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

長さに関係なくすべての行を提供します。

上記の最後の2つのフォームはどのように機能しますか?正規表現形式に従います。

.{,80}

80文字以下のすべての文字を表します。

答え1

grep ".\{0,81\}" foo.txt

すべての行がこれと一致します。行に82文字がある場合、行も81文字になります。あなたが必要とする:

  • 行の先頭から最後まで 0 ~ 81 文字になるように正規表現を^and で囲みます。または$
  • 行がこの正規表現と正確に一致することを指定するために使用されます-x(上記のオプションと同じ)。

だから:

grep "^.\{0,81\}$" foo.txt
grep -x ".\{0,81\}" foo.txt

答え2

すべてのUNIXシステムのすべてのシェルで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

簡単に考えて覚えてくださいことわざのように:

何人かの人々が問題に直面したとき、「わかりました。正規表現を使います」と思います。今、彼らは2つの問題を抱えています。

関連情報