0

我有话要说

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

我想要一个脚本ASP.NET在每一行中进行模式搜索并打印 10 个字符,这样它就会涉及BirdDog

谢谢

4

6 回答 6

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 之间的任意数量的字符以贪婪的方式。如果成功,则执行以下指令,打印括号之间匹配的内容。

于 2013-01-19T21:25:04.420 回答
3
perl -lne 'print $1 if /ASP.net (.{0,10})/'
于 2013-01-19T21:25:57.743 回答
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
于 2013-01-19T21:32:12.920 回答
2

GNU 和 BSD greps 有一个很好的扩展--only-matching, or -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
于 2013-01-19T21:22:23.587 回答
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”的位置之后开始
于 2013-01-19T21:32:14.610 回答
0

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

sed -nr '/.*ASP\.net(.{,10}).*/s//\1/p' file
于 2013-01-19T21:37:21.623 回答