* 在 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

我预计只有最后四行作为输出。 在此输入图像描述

答案1

您错过了 描述中的“空字符串”部分*,该部分出现在每一行中。

在awk中,匹配一个或多个B,使用/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)

正如您所看到的,文件底部只有三行包含大写字母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)

相关内容