假设我有这个文本
233-CO 的代码是 45-DFG 和这个 45-GH 的主要原因
现在我有这个 \s[0-9]+-\w+
匹配233-CO
,45-DFG
和45-GH
.
我怎样才能只显示第三场比赛45-GH
?
sed -re 's/\s[0-9]+-\w+/\3/g' file.txt
\3
第三个正则表达式匹配在哪里。
是强制使用sed
吗?您可以grep
使用数组来做到这一点:
text="The code for 233-CO is the main reason for 45-DFG and this 45-GH"
matches=( $(echo "$text" | grep -o -m 3 '\s[0-9]\+-\w\+') ) # store first 3 matches in array
echo "${matches[0]} ${matches[2]}" # prompt first and third match
这可能对您有用(GNU sed):
sed -r 's/\b[0-9]+-[A-Z]+\b/\n&\n/3;s/.*\n(.*)\n.*/\1/' file
s/\b[0-9]+-[A-Z]+\b/\n&\n/3
\n
在有问题的第三个 (n) 模式之前添加和附加(换行符)。s/.*\n(.*)\n.*/\1/
删除图案前后的文字grep
用于匹配和打印sed
事件:
$ egrep -o '\b[0-9]+-\w+' file | sed -n '1p'
233-CO
$ egrep -o '\b[0-9]+-\w+' file | sed -n '2p'
45-DFG
$ egrep -o '\b[0-9]+-\w+' file | sed -n '3p'
45-GH
或者稍微awk
传递一下使用变量打印的事件o
:
$ awk -v o=1 '{for(i=0;i++<NF;)if($i~/[0-9]+-\w+/&&j++==o-1)print $i}' file
233-CO
$ awk -v o=2 '{for(i=0;i++<NF;)if($i~/[0-9]+-\w+/&&j++==o-1)print $i}' file
45-DFG
$ awk -v o=3 '{for(i=0;i++<NF;)if($i~/[0-9]+-\w+/&&j++==o-1)print $i}' file
45-GH
如果 awk 被接受,有一个 awk onliner,你给你想抓取的匹配的 No#,它给你匹配的 str。
awk -vn=$n '{l=$0;for(i=1;i<n;i++){match(l,/\s[0-9]+-\w+/,a);l=substr(l,RSTART+RLENGTH);}print a[0]}' file
测试
kent$ echo $STR #so we have 7 matches in str
The code for 233-CO is the main reason for 45-DFG and this 45-GH,foo 004-AB, bar 005-CC baz 006-DDD and 007-AWK
kent$ n=6 #now I want the 6th match
#here you go:
kent$ awk -vn=$n '{l=$0;for(i=1;i<=n;i++){match(l,/\s[0-9]+-\w+/,a);l=substr(l,RSTART+RLENGTH);}print a[0]}' <<< $STR
006-DDD
要查找模式的最后一次出现,您可以使用以下命令:
$ sed -re 's/.*\s([0-9]+-\w+).*/\1/g' file
45-GH