如何在sed中显示第二个匹配的正则表达式

时间:2013-01-17 05:33:59

标签: regex sed

假设我有这个文本

The code for 233-CO is the main reason for 45-DFG and this 45-GH

现在我有一个与\s[0-9]+-\w+233-CO45-DFG匹配的正则表达式45-GH

如何只展示第三场比赛45-GH

sed -re 's/\s[0-9]+-\w+/\3/g' file.txt

其中\3应该是第三个正则表达式匹配。

5 个答案:

答案 0 :(得分:2)

是否必须使用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

答案 1 :(得分:0)

要查找模式的最后一次出现,可以使用:

$ sed -re 's/.*\s([0-9]+-\w+).*/\1/g' file
45-GH

答案 2 :(得分:0)

如果awk被接受,则有一个awk在线玩家,你给出你想要抓住的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

答案 3 :(得分:0)

这可能适合你(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/删除模式前后的文字

答案 4 :(得分:0)

使用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