web-dev-qa-db-ja.com

awkの繰り返し{n}が機能していません

繰り返し記号{n}を使用して行を印刷しようとしていますが、機能しません。ために。例えば長さが4文字のすべての行を印刷したい

 awk '/^.{4}$/' test_data

上記のコードはそれを印刷していません。繰り返し記号を使用できるように修正するにはどうすればよいですか? awk '/^....$/' test_dataおよびawk 'length ==3 ' test_data

18
Forever Learner

これはGNU awk(gawk)で期待どおりに機能します:

$ printf 'abcd\nabc\nabcde\n' | gawk '/^.{4}$/'
abcd

しかし、POSIX mawkに近いawkで失敗します。AFAIKは、Ubuntuシステムのデフォルトです。

$ printf 'abcd\nabc\nabcde\n' | mawk '/^.{4}$/'
$ ## prints nothing

したがって、単純な解決策は、gawkの代わりにawkを使用することです。 {n}表記は、POSIX BRE(基本正規表現)構文の一部ではありません。 grepもここで失敗するのはそのためです。

$ printf 'abcd\nabc\nabcde\n' | grep '^.{4}$'
$

ただし、これはERE(拡張正規表現)の一部です。

$ printf 'abcd\nabc\nabcde\n' | grep -E '^.{4}$'
abcd

mawkまたはPOSIX awkで使用されている正規表現のフレーバーはわかりませんが、BREだと思いますStéphane's answer によると、古いバージョンのEREを使用しています。いずれの場合も、EREを実装していないバージョンのawkを使用しているように見えるか、入力に実際にちょうど4文字の行が含まれていません。これは、たとえば、表示されない空白やグリフのユニコード化が原因で発生する可能性があります。

6
terdon