【问题标题】:print n character after pattern match模式匹配后打印 n 个字符
【发布时间】:2026-02-05 07:30:01
【问题描述】:

我有话要说

jan 02:12:00 YRU QRS : ASP.net Bird
feb 02:12:00 YRU QRS : ASP.net Dog

我希望脚本具有ASP.NET 的模式搜索并在每行中打印其中的 10 个字符,这样它就会涉及 BirdDog

谢谢

【问题讨论】:

  • 欢迎来到 *!您可以通过发布您尝试过的代码示例及其产生的输出来改进您的问题。 * 旨在帮助人们,但不是为他们做这件事。请阅读the FAQ

标签: perl bash sed awk


【解决方案1】:

一种使用perl的方式:

perl -ne 'm/asp\.net\s+(.{0,10})/i && print "$1\n"' infile

产生:

Bird
Dog

EDIT 解释perl one-liner 的语法:

m/.../i 尝试将正则表达式与整行匹配。 i 标志忽略大小写。正则表达式是文字 asp.net 加上空格加上 0 到 10 之间的任意数量的字符以贪婪的方式。如果成功,则执行以下指令,打印括号之间匹配的内容。

【讨论】:

  • 真棒Birei,谢谢你能带我看一下语法。它将帮助我走向美好的世界。
【解决方案2】:
perl -lne 'print $1 if /ASP.net (.{0,10})/'

【讨论】:

  • 如果你解释一下-l选项会更好(这有点不寻常)。
  • @JonathanLeffler:我认为-l 并不罕见,尽管我同意这个解决方案简洁到粗鲁。
  • @Borodin:我猜不寻常是在旁观者的眼中;我从来没有使用过我记得的-l,我必须查看它才能知道它的作用(尽管它有时可能很有用,如果我记得使用它的话),而且我只在 Perl 中编程过现在大约二十年了。然而,Perl 有这么多的子方言,它可能并不能说明任何事情,只是它是一种大型语言/程序,有很多选项,并不是每个人都一直在使用。
  • @JonathanLeffler:它在-ln-lp 等单行代码中特别普遍,因为它避免了chomp 输入和在print 上写入显式"\n" 的需要陈述。 perl -lne 几乎是一个成语,如果你用谷歌搜索就会看到。
【解决方案3】:

awk 单行:

awk -F'ASP\\.net' '{print substr($2,0,10)}' file

请注意,这将在ASP.net 之后立即打印 10 个字符,这意味着从space 开始。如果您不想要空间,请使用以下行:

 awk -F'ASP\\.net ' '{print substr($2,0,10)}' file

【讨论】:

    【解决方案4】:

    GNU 和 BSD greps 有一个很好的扩展名 --only-matching-o,它只会输出你匹配的那部分行:

    grep -Eio 'asp\.net.{0,10}' <<< 'jan 02:12:00 YRU QRS : ASP.net Bird
    feb 02:12:00 YRU QRS : ASP.net Dog'
    ASP.net Bird
    ASP.net Dog
    

    Bash 可以通过它的正则表达式功能做到这一点,但如果你先打开不区分大小写的匹配可能会更好:

    shopt -s nocasematch
    while read; do
        if [[ $REPLY =~ asp\.net(.{0,10}) ]]; then
            echo "${BASH_REMATCH[1]}"
        fi
    done <<< 'jan 02:12:00 YRU QRS : ASP.net Bird
    feb 02:12:00 YRU QRS : ASP.net Dog'
     Bird
     Dog
    

    【讨论】:

      【解决方案5】:

      假设您在文件“input.txt”中有文本,以下单行将完成这项工作:

      cat input.txt | awk '/ASP\.net/ {print substr($0, index($0,"ASP.net") + length("ASP.net"), 10)}'
      

      解释:

      • 在包含文本“ASP.net”的行上
      • 打印 10 个字符
      • 在“ASP.net”的位置之后开始

      【讨论】:

      • 不需要UUOCawk 可以直接将文件名作为参数。 (如果不能,你可以直接&lt; input.txt。)
      【解决方案6】:

      这可能对你有用(GNU sed):

      sed -nr '/.*ASP\.net(.{,10}).*/s//\1/p' file
      

      【讨论】:

        最近更新 更多