【问题标题】:How I search and print matched wold in UNIX or perl?如何在 UNIX 中为 perl 搜索和打印匹配的单词?
【发布时间】:2019-08-17 16:52:11
【问题描述】:
1=ABC,2=mnz,3=xyz
1=pqr,3=ijk,2=lmn

我在文本文件中有这个我想搜索 1= 并且应该只打印匹配的单词 1=ABC1=pqr

对 Perl 或 Unix 有什么建议吗?

【问题讨论】:

  • 你试过什么?你有什么问题?请向我们展示您的代码。
  • 如果我们已经回答了您的问题,请您接受答案/点赞,详情如下:stackoverflow.com/help/someone-answers

标签: perl unix


【解决方案1】:

输入:

$ cat grep.in 
1=ABC,2=mnz,3=xyz
1=pqr,3=ijk,2=lmn
4=pqr,3=ijk,2=lmn

命令:

$ grep -o '1=[^,]\+' grep.in 
1=ABC
1=pqr

说明:

您可以在输入时使用grep

  • -o 是只输出匹配的模式
  • 1=[^,]\+ 正则表达式将匹配以1= 开头的字符串,后跟至少一个不是逗号的字符(我基于这样的假设:= 的右侧部分没有逗号,除了分隔符)
  • 如果您想接受空结果,您可以将\+ 更改为*

【讨论】:

  • 谢谢..有什么建议可以尝试多种模式吗?我尝试使用 egrep 但没有奏效。例如:grep 表示 1= 和 2=
  • @user4786572:如果你想要12,然后将grep -o '1=[^,]\+' 替换为grep -o '[12]=[^,]\+',如果你有任何问题,请告诉我!
  • 对不起艾伦..我有一些以 1 、 11 和 38 开头的东西来搜索我如何使用它? 1=xyz,11=pqr,38=lmn
  • @user4786572:你为什么要道歉?大声笑如果我们已经回答了您的问题,您能否接受详细的回答/投票:stackoverflow.com/help/someone-answers
  • @user4786572: 只需使用grep -oE '(1|11|38)=[^,]+' grep.in 这应该可以正常工作。
【解决方案2】:

您的输入数据似乎是 CSV 格式。这是一个基于Text::CSV的Perl解决方案

  • 按行解析 CSV 内容
  • 打印出以1= 开头的列
#!/usr/bin/perl
use warnings;
use strict;

use Text::CSV;

my $csv = Text::CSV->new({
    binary   => 1,
    eol      => "\n",
}) or die "CSV\n";

# parse
while (my $row = $csv->getline(\*DATA)) {
    foreach (@{ $row }) {
        print "$_\n" if /^1=/;
    }
}

exit 0;

__DATA__
1=ABC,2=mnz,3=xyz
1=pqr,3=ijk,2=lmn

试运行:

$ perl dummy.pl
1=ABC
1=pqr

DATA 替换为STDIN 以改为从标准输入读取输入。

【讨论】:

  • 老实说,对于像这样简单的 CSV,我会调用 Text::CSV 过大,并且拆分绰绰有余。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2018-02-25
  • 1970-01-01
相关资源
最近更新 更多