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

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

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

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

上記のコードはそれを印刷しません。重複記号を使用できるように変更するにはどうすればよいですか?私はawk '/^....$/' test_data次の選択肢を知っていますawk 'length ==3 ' test_data

答え1

~によるとGNU Awkユーザーガイド:機能履歴、正規表現範囲演算子のサポートがバージョン3.0に追加されましたが、最初は明示的なコマンドラインオプションが必要でした。

新しいコマンドラインオプション:

  • 新しいコマンドラインオプション:
    • --lint-oldオプションは、awkの元のバージョン7 Unixバージョンでは利用できなかった設定を警告するために使用されます(V7 / SVR3.1を参照)。
    • awk の BWK -m オプションです。 (Brianは当時Bell Labsにいました。)この文は後で彼のawkとgawkから削除されました。
    • --re-intervalオプションは、正規表現に間隔式を提供するために使用されます(正規表現演算子を参照)。
    • --compatのより良い名前で--traditionalオプションを追加しました(オプションを参照)。

gawk4.0では

間隔式が基本正規表現の一部になります。

3.xを使用しているので、gawk次のものを使用する必要があります。

awk --re-interval '/^.{4}$/'

または

awk --posix '/^.{4}$/'

または(@StéphaneChazelasのおかげで)ポータブルソリューションが必要な場合は、次のようにします。

POSIXLY_CORRECT=anything awk '/^.{4}$/'

(他の実装ではエラーが発生する--posix可能性があるためです。)--re-intervalawk

答え2

むしろ(拡張正規表現awkまたは)で使用されているようegrepに最初は{x,y}。 BRE(greporで使用sed)で最初に導入されましたが、その\{x,y\}構文は以前のバージョンの移植性を損なうことはありません。

ただし、その構文を使用してEREに追加すると、REは以前に他のものと一致する{x,y}ため、逆方向移植性は中断されます。foo{2}

したがって、一部の実装ではこれを行わないことを選択します。 Solarisではまだ尊重されていない/bin/awkことがわかります(またはを使用する必要があります)。 FreeBSDと同じです(ベース/bin/nawk/bin/egrep/usr/xpg4/bin/awk/usr/xpg4/bin/grep -EawknawkawkBrian Kernighanが管理k中央awk))。

GNUの場合awkPOSIXLY_CORRECT=anything awk '/^.{4}$/'、最近(バージョン4.0)まで現金化するには、と呼ぶ必要がありました。mawkまだ尊敬していない

この演算子は単なる構文上の砂糖です。例を.{3,5}書くことは常に可能です....?.?(もちろんこれは{3,5}もっと読みやすくなりますが、それに対応する場合は(foo.{5,9}bar){123,456}悪いです)。

答え3

awkこれはGNU(gawk)で予想されるものと一致します。

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

しかし失敗しました。mawkPOSIX と AFAIK に近いawkUbuntu システムのデフォルト値です。

$ 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が使うのか分からないがawkBREのようです。。彼らは、以下に基づいて以前のバージョンのEREを使用します。スティーブンの答え。とにかく、EREを実装していないバージョンを使用しているか、awk入力に実際に4文字を含む行はありません。たとえば、空白やUnicode文字が表示されないため、これが発生する可能性があります。

関連情報