繰り返し記号{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オプションを追加しました(オプションを参照)。
gawk
4.0では
間隔式が基本正規表現の一部になります。
3.xを使用しているので、gawk
次のものを使用する必要があります。
awk --re-interval '/^.{4}$/'
または
awk --posix '/^.{4}$/'
または(@StéphaneChazelasのおかげで)ポータブルソリューションが必要な場合は、次のようにします。
POSIXLY_CORRECT=anything awk '/^.{4}$/'
(他の実装ではエラーが発生する--posix
可能性があるためです。)--re-interval
awk
答え2
むしろ(拡張正規表現awk
または)で使用されているようegrep
に最初は{x,y}
。 BRE(grep
orで使用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 -E
awk
nawk
awk
Brian Kernighanが管理(k
中央awk
))。
GNUの場合awk
POSIXLY_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
しかし失敗しました。mawk
POSIX と AFAIK に近いawk
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
。彼らは、以下に基づいて以前のバージョンのEREを使用します。スティーブンの答え。とにかく、EREを実装していないバージョンを使用しているか、mawk
どの正規表現スタイルやPOSIXが使うのか分からないがawk
BREのようです。awk
入力に実際に4文字を含む行はありません。たとえば、空白やUnicode文字が表示されないため、これが発生する可能性があります。