我有话要说
jan 02:12:00 YRU QRS : ASP.net Bird
feb 02:12:00 YRU QRS : ASP.net Dog
我想要一个脚本ASP.NET
在每一行中进行模式搜索并打印 10 个字符,这样它就会涉及Bird
和Dog
谢谢
一种使用方式perl
:
perl -ne 'm/asp\.net\s+(.{0,10})/i && print "$1\n"' infile
这会产生:
Bird
Dog
编辑以解释单线的语法perl
:
m/.../i
尝试将正则表达式与整行匹配。该i
标志忽略这种情况。正则表达式是文字asp.net
加上空格加上 0 到 10 之间的任意数量的字符以贪婪的方式。如果成功,则执行以下指令,打印括号之间匹配的内容。
perl -lne 'print $1 if /ASP.net (.{0,10})/'
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
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
假设您在文件“input.txt”中有文本,以下单行将完成这项工作:
cat input.txt | awk '/ASP\.net/ {print substr($0, index($0,"ASP.net") + length("ASP.net"), 10)}'
解释:
这可能对您有用(GNU sed):
sed -nr '/.*ASP\.net(.{,10}).*/s//\1/p' file