AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 501169
Accepted
Lukáš Altman
Lukáš Altman
Asked: 2019-02-18 06:42:12 +0800 CST2019-02-18 06:42:12 +0800 CST 2019-02-18 06:42:12 +0800 CST

* 在 awk 中(元字符)

  • 772

你能解释一下 * 是如何工作的吗?

我有一个输入:

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

我希望只有最后四行作为输出。 在此处输入图像描述

awk regular-expression
  • 2 2 个回答
  • 67 Views

2 个回答

  • Voted
  1. Best Answer
    Jeff Schaller
    2019-02-18T06:51:04+08:002019-02-18T06:51:04+08:00

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

    在 awk 中,要匹配一个或多个B,请使用/B+/

    • 3
  2. Kusalananda
    2019-02-18T07:09:45+08:002019-02-18T07:09:45+08:00

    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)
    
    • 3

相关问题

  • 在另一个文件之后逐行追加行

  • 更少:使用 AND 的多个过滤条件

  • 如何删除两行之间的单行

  • 重新排列字母并比较两个单词

  • 多行文件洗牌

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve