模式匹配后打印n个字符

时间:2013-01-19 21:08:53

标签: perl bash sed awk

我有说法

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

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

由于

6 个答案:

答案 0 :(得分:3)

使用perl的一种方式:

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

产量:

Bird
Dog

编辑解释perl单行的语法:

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

答案 1 :(得分:3)

perl -lne 'print $1 if /ASP.net (.{0,10})/'

答案 2 :(得分:1)

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

答案 3 :(得分:0)

awk one-liner:

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 :(得分:0)

假设你在文件“input.txt”中有文字,下面的单行将完成这项工作:

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

说明:

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

答案 5 :(得分:0)

这可能适合你(GNU sed):

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