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
    • 最新
    • 标签
主页 / computer / 问题 / 1837977
Accepted
pmor
pmor
Asked: 2024-04-05 19:19:00 +0800 CST2024-04-05 19:19:00 +0800 CST 2024-04-05 19:19:00 +0800 CST

如何仅打印匹配行的匹配(非空)部分,并且每个此类部分都在同一输出行上?

  • 772

从man grep:

-o, --only-matching
  Print only the matched (non‐empty) parts of a matching line, with each such part on a separate output line.

一个简单的问题:如何仅打印匹配行的匹配(非空)部分,并且每个此类部分都在同一输出行上?

grep
  • 2 2 个回答
  • 32 Views

2 个回答

  • Voted
  1. Best Answer
    Toto
    2024-04-05T20:53:27+08:002024-04-05T20:53:27+08:00

    以下是使用 Perl 语句完成这项工作的一种方法:

    ~/dev/perl$ cat file1
    blah foo blah bar blah foo
    blah bar blah bar
    bar blah bar foo foo blah bar foo
    ~/dev/perl$ perl -ane '@l=$_=~/(foo)/g;print"@l\n"if@l' file1
    foo foo
    foo foo foo
    ~/dev/perl$
    

    解释:

    perl -ane '             # invoque Perl interpreter
    @l=$_=~/(foo)/g;        # match all "foo" (here insert the string to match) on a line and store in an array (@l)
    print"@l\n"if@l         # print the array if not empty
    ' 
    file1                   # file to be processed
    
    • 1
  2. sqrt-1
    2024-04-05T23:47:49+08:002024-04-05T23:47:49+08:00

    使用 grep 和 awk 的另一种可能的解决方案:

    └─$ cat file1
    blah foo blah bar blah foo
    blah bar blah bar
    bar blah bar foo foo blah bar foo  
    
    ─$ grep -on foo file | awk -F ":" 's != $1 || NR==1{s=$1;if(p){print p};p=$2;next};{p=p" "$2;}END{print p}'
    foo foo
    foo foo foo
    

    即:
    grep -on foo file --> 匹配模式 foo 并在输出的每一行前面加上输入文件中基于 1 的行号。如果有多个匹配项,则重复相同的行号,例如:

    └─$ grep -on foo file 
    1:foo
    1:foo
    3:foo
    3:foo
    3:foo
    

    awk:

    1. -F ":"--> 考虑冒号作为分隔符来解析字段
    2. s != $1 || NR==1--> 检查变量是否s与第一个字段的值不同或正在分析的行是第一个字段。如果为 true,请执行以下操作:
      • s=$1;--> 变量 s 取第一个字段的值(行号)
      • if(p){print p};--> 如果变量p被赋值,则打印它
      • p=$2;--> 变量p取第二个字段的值(匹配模式)
      • next--> 进入下一次迭代,并开始重新评估s != $1 || NR==1下一行的条件
    3. {p=p" "$2;}--> 如果第 2 步的条件为 false(当行号与前一行相同时:同一行上有多个匹配),则变量p将其自身值连接到该行的第二个字段(匹配模式)正在分析(它们之间有空格)。
    4. END{print p}--> 最后,分析完所有行后,打印变量 p 中保存的最后一个值。

    因此,在上面的情况下:
    第 1 行-->1:foo被分析:条件为真,因为NR==1。s取 vale 1,p未赋值,因此不打印, p 取值 foo ,继续分析第二行。
    第 2 行-->1:foo被分析:条件为 false,因为 s==$1(该行的第一个字段是 = 1,变量s来自1上一步)和 NR==2(我们在第二行)。因此,我们继续执行{p=p" "$2;},变量p取自身值 + " " + $2 (即foo),成为foo foo
    第 3 行-->3:foo进行分析:条件为真,因为s!=$1(确实s是1第三行的第一个字段是3)。s取 vale 3,p被赋值(foo foo来自上一步),因此被打印,p取值foo,继续分析第 4 行第 4
    行-->3:foo被分析:条件为 false,因为 s==$1 (此字段的第一个字段)行 = 3,变量s来自3上一步)和 NR==4(我们在第四行)。因此,我们继续执行{p=p" "$2;},变量p取自身值 + " " + $2 (即foo),成为foo foo
    第 5 行-->3:foo进行分析:条件为 false,因为 s==$1 (该行的第一个字段是 = 3变量s是3从步骤 3 开始)并且 NR==5(我们在第 5 行)。因此,我们继续执行{p=p" "$2;},变量p取自身值(即上一步中的 'foo foo')+ " " + $2 (即foo),成为foo foo foo
    END --> 没有更多的行需要分析。END因此执行之后的部分,并打印{print p}变量p(现在包含上一步中的 , )。foo foo foo

    最终输出:

    foo foo
    foo foo foo
    
    • 0

相关问题

  • 在命令行(终端)中显示只有单词(没有数字)的字符串

  • 为什么我的 bash shell 脚本将空格更改为换行符?

  • egrep 在包含数字和单词的文件中查找那些不以 91 或 93 开头的数字

  • grep 匹配直到字符第一次出现

  • 如何使用 FFmpeg 获得最终的 LUF 值?

Sidebar

Stats

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

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve