2

このテキストがあるとします

233-CO のコードは、45-DFG とこの 45-GH の主な理由です。

これで、と\s[0-9]+-\w+に一致する正規表現 ができました。233-CO45-DFG45-GH

3 番目の一致だけを表示するにはどうすればよい45-GHですか?

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

どこ\3に 3 番目の正規表現の一致があるはずです。

4

5 に答える 5

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
于 2013-01-17T05:58:25.303 に答える
0

awkが受け入れられた場合、awk onlinerがあり、取得したい一致番号を指定すると、一致した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
于 2013-01-17T11:17:45.933 に答える
0

With grep for matching and sed for printing the occurrence:

$ 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

Or with a little awk passing the occurrence to print using the variable 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
于 2013-01-18T11:59:45.143 に答える
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問題の 3 番目 (n) のパターンの先頭と末尾に (改行) を追加します。
  • s/.*\n(.*)\n.*/\1/パターンの前後のテキストを削除する
于 2013-01-18T11:28:14.897 に答える
0

パターンの最後の出現を見つけるには、これを使用できます。

$ sed -re 's/.*\s([0-9]+-\w+).*/\1/g' file
45-GH
于 2013-01-17T05:53:00.230 に答える