你能解释一下 * 是如何工作的吗?
我有一个输入:
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)