* awk(メタ文字)

* awk(メタ文字)

*がどのように機能するかを説明できますか?

入力があります。

U         8649 275  Asia
Canada    3852 25   North America
China     3705 1032 Asia
USA       3615 237  North America
India     1267 746  -Asia
Mexico    762  78   -North America
France    211  55   Europe
Japan     144  120  Asia
England   94   56   Europe
cim 
B
BB

BBB

私はコマンドを試しました

awk '/B*/' countries

出力は次のとおりです

U         8649 275  Asia
Canada    3852 25   North America
China     3705 1032 Asia
USA       3615 237  North America
India     1267 746  -Asia
Mexico    762  78   -North America
France    211  55   Europe
Japan     144  120  Asia
England   94   56   Europe
cim 
B
BB

BBB

最後の4行だけが出力されると予想されます。 ここに画像の説明を入力してください。

答え1

*すべての行に表示される説明の「空の文字列」部分を見逃しました。

awkで一致1つ以上雨、使用/B+/

答え2

B*空の文字列と一致します。各キャラクター間に一致する項目があります。すべてワイヤー。

これはあなたのための教育ツールです:

awk -v re='B+' '{ gsub(re, "(&)"); print }' file

このawkプログラムは与えられた式と一致し、各一致を一致するものに置き換えます(括弧内にあります)。完璧ではありませんが、最も簡単な教育目的に使用されます。

sed一部の拡張正規表現の場合、それに対応するものは次のとおりですPATTERN

sed -E 's/(PATTERN)/(&)/g' file

awk式を使用してデータに対してコマンドを実行しますB+

$ awk -v re='B+' '{ gsub(re, "(&)"); print }' file
U         8649 275  Asia
Canada    3852 25   North America
China     3705 1032 Asia
USA       3615 237  North America
India     1267 746  -Asia
Mexico    762  78   -North America
France    211  55   Europe
Japan     144  120  Asia
England   94   56   Europe
cim
(B)
(BB)

(BBB)

ご覧のとおり、ファイルの下部の3行にのみ大文字が含まれているため、その行のみがB一致します。

別の例は次のとおりですB

$ awk -v re='B' '{ gsub(re, "(&)"); print }' file
U         8649 275  Asia
Canada    3852 25   North America
China     3705 1032 Asia
USA       3615 237  North America
India     1267 746  -Asia
Mexico    762  78   -North America
France    211  55   Europe
Japan     144  120  Asia
England   94   56   Europe
cim
(B)
(B)(B)

(B)(B)(B)

ここではそれぞれ個別Bに一致します。

最後に、質問の実際の表現(私のデータはタブで正しく区切られていません)は以下を使用しますB*

$ awk -v re='B*' '{ gsub(re, "(&)"); print }' file
()U() () () () () () () () () ()8()6()4()9() ()2()7()5() () ()A()s()i()a()
()C()a()n()a()d()a() () () () ()3()8()5()2() ()2()5() () () ()N()o()r()t()h() ()A()m()e()r()i()c()a()
()C()h()i()n()a() () () () () ()3()7()0()5() ()1()0()3()2() ()A()s()i()a()
()U()S()A() () () () () () () ()3()6()1()5() ()2()3()7() () ()N()o()r()t()h() ()A()m()e()r()i()c()a()
()I()n()d()i()a() () () () () ()1()2()6()7() ()7()4()6() () ()-()A()s()i()a()
()M()e()x()i()c()o() () () () ()7()6()2() () ()7()8() () () ()-()N()o()r()t()h() ()A()m()e()r()i()c()a()
()F()r()a()n()c()e() () () () ()2()1()1() () ()5()5() () () ()E()u()r()o()p()e()
()J()a()p()a()n() () () () () ()1()4()4() () ()1()2()0() () ()A()s()i()a()
()E()n()g()l()a()n()d() () () ()9()4() () () ()5()6() () () ()E()u()r()o()p()e()
()c()i()m() ()
(B)
(BB)
()
(BBB)

これは、末尾の複数の文字間の一致をB*除いて、ファイル全体のすべての文字間の一致を示します。B

[A-Za-z-][A-Za-z-]+また、これを使って(あなたが私に尋ねました)の違いを示すこともできます。前に):

$ awk -v re='[A-Za-z-]' '{ gsub(re, "(&)"); print }' file
(U)         8649 275  (A)(s)(i)(a)
(C)(a)(n)(a)(d)(a)    3852 25   (N)(o)(r)(t)(h) (A)(m)(e)(r)(i)(c)(a)
(C)(h)(i)(n)(a)     3705 1032 (A)(s)(i)(a)
(U)(S)(A)       3615 237  (N)(o)(r)(t)(h) (A)(m)(e)(r)(i)(c)(a)
(I)(n)(d)(i)(a)     1267 746  (-)(A)(s)(i)(a)
(M)(e)(x)(i)(c)(o)    762  78   (-)(N)(o)(r)(t)(h) (A)(m)(e)(r)(i)(c)(a)
(F)(r)(a)(n)(c)(e)    211  55   (E)(u)(r)(o)(p)(e)
(J)(a)(p)(a)(n)     144  120  (A)(s)(i)(a)
(E)(n)(g)(l)(a)(n)(d)   94   56   (E)(u)(r)(o)(p)(e)
(c)(i)(m)
(B)
(B)(B)

(B)(B)(B)
$ awk -v re='[A-Za-z-]+' '{ gsub(re, "(&)"); print }' file
(U)         8649 275  (Asia)
(Canada)    3852 25   (North) (America)
(China)     3705 1032 (Asia)
(USA)       3615 237  (North) (America)
(India)     1267 746  (-Asia)
(Mexico)    762  78   (-North) (America)
(France)    211  55   (Europe)
(Japan)     144  120  (Asia)
(England)   94   56   (Europe)
(cim)
(B)
(BB)

(BBB)

関連情報