목록의 특정 텍스트를 대문자로 변환하는 방법은 무엇입니까?

목록의 특정 텍스트를 대문자로 변환하는 방법은 무엇입니까?

United" "로 시작하는 국가의 모든 드라이버 이름을 대문자로 쓰고 싶습니다 .

예를 들어:

~에서

20  [United Kingdom] Nigel Mansell                 188 31

도착하다

20  [United Kingdom] NIGEL MANSELL                 188 31

내가 사용하는 명령은 다음과 같습니다.

cat f1.txt | sed -r 's/[^ ]"United"\s+[A-Z]+[a-z]*]\s+[A-Z]+[a-z]*\s+[A-Z]+[a-z]*-?[A-Z]?+[a-z]?*/\U&/g'

전체 목록:

Rank Country         Driver                      Races Wins
1   [United Kingdom] Lewis Hamilton                264 94
3   [Spain] Fernando Alonso                        311 32
8   [United Kingdom] Jenson Button                 306 15
11  [Netherlands] Max Verstappen                   116 9
17  [United Kingdom] David Coulthard               246 13
20  [United Kingdom] Nigel Mansell                 188 31
26  [United Kingdom] Jackie Stewart                100 27
27  [United Kingdom] Damon Hill                    115 22
28  [Spain] Carlos Sainz Jr.                       115 0
32  [United Kingdom] Graham Hill                   177 14
37  [United Kingdom] Jim Clark                     72  25
38  [Poland] Robert Kubica                         97  1
41  [South Africa] Jody Scheckter                  112 10
42  [New Zealand] Denny Hulme                      112 8
47  [Switzerland] Clay Regazzoni                   131 5
49  [Sweden] Ronnie Peterson                       123 10
50  [New Zealand] Bruce McLaren                    102 4
51  [Russian Federation] Daniil Kvyat              107 0
52  [United Kingdom] Eddie Irvine                  147 4
54  [United Kingdom] Stirling Moss                 72  16
58  [United Kingdom] John Surtees                  111 6
59  [United States] Mario Andretti                 128 12
60  [United Kingdom] James Hunt                    92  10
63  [United Kingdom] John Watson                   152 5
64  [Thailand] Alexander Albon                     35  0
69  [United States] Dan Gurney                     86  4
71  [United Kingdom] Mike Hawthorn                 48  3
76  [United Kingdom] Lando Norris                  35  0
78  [United Kingdom] Paul di Resta                 59  0
80  [United States] Richie Ginther                 52  1
85  [United States] Phil Hill                      51  3
86  [United Kingdom] Martin Brundle                158 0
87  [United Kingdom] Johnny Herbert                161 3
89  [Sweden] Stefan Johansson                      79  0
90  [New Zealand] Chris Amon                       97  0
94  [United Kingdom] Tony Brooks                   41  6
95  [Venezuela] Pastor Maldonado                   95  1
99  [United Kingdom] Derek Warwick                 147 0
100 [United States] Eddie Cheever                  132 0
101 [Switzerland] Jo Siffert                       97  2
103 [Russian Federation] Vitaly Petrov             57  0
104 [United Kingdom] Peter Revson                  30  2
113 [United Kingdom] Peter Collins                 36  3
114 [United Kingdom] Innes Ireland                 52  1
119 [Sweden] Jo Bonnier                            106 1
120 [Spain] Pedro de la Rosa                       105 0
124 [United Kingdom] Mark Blundell                 61  0
125 [United States] Harry Schell                   63  0
127 [Sweden] Gunnar Nilsson                        31  1
128 [Spain] Jaime Alguersuari                      46  0
130 [United States] Jim Rathmann                   12  1
132 [United Kingdom] Mike Hailwood                 51  0
133 [Switzerland] Sebastien Buemi                  55  0
135 [United Kingdom] Mike Spence                   36  0
136 [South Africa] Tony Maggs                      26  0
140 [United States] Masten Gregory                 40  0
142 [United States] Sam Hanks                      9   1
143 [United Kingdom] Piers Courage                 27  0
145 [United States] Bill Vukovich                  5   2
147 [United Kingdom] Tom Pryce                     42  0
148 [United Kingdom] Roy Salvadori                 48  0
149 [United States] Jimmy Bryan                    9   1
153 [Sweden] Marcus Ericsson                       97  0
159 [Switzerland] Marc Surer                       82  0
160 [Netherlands] Jos Verstappen                   106 0
161 [United Kingdom] Stuart Lewis-Evans            14  0
167 [United Kingdom] Mike Parkes                   6   0
168 [United States] Rodger Ward                    12  1
174 [United Kingdom] Jonathan Palmer               84  0
176 [Sweden] Reine Wisell                          23  0
179 [United Kingdom] Jackie Oliver                 50  0
180 [United States] Johnnie Parsons                10  1
181 [United Kingdom] Peter Arundell                13  0
185 [United States] Tony Bettenhausen              13  0
186 [United Kingdom] Cliff Allison                 16  0
187 [United Kingdom] Richard Attwood               17  0
188 [United Kingdom] Peter Gethin                  30  1
191 [Switzerland] Rudi Fischer                     7   0
192 [United States] Johnny Thomson                 9   0
194 [New Zealand] Howden Ganley                    36  0
199 [United States] Troy Ruttman                   8   1
200 [United States] Lee Wallard                    2   1

답변1

너무 멀리 가셨습니다. 파일 구조를 사용하여 단순하게 유지하세요!

한 줄에서 문자열을 찾으면 [United닫는 중괄호부터 줄 끝까지 모든 것을 대문자로 사용하면 원하는 결과를 얻을 수 있습니다. Sed 언어로 번역하면,

sed '/\[United/s/].*/\U&/' file

위 내용은 GNU Sed에만 해당됩니다. 사용할 수 없지만 POSIX 시스템에서는 사용할 수 있습니다.전임자(또는 참조αГsнιι의 Awk 버전) 비슷한 구문이 있습니다.

printf '%s\n' 'g/\[United/s/].*/\U&/' '%p' | ex file

결과를 인쇄하는 대신 파일에 대한 변경 사항을 저장하려면 %p로 변경하십시오 x.

답변2

사용 awk:

awk -F"[][]" '$2 ~/^United/ { $2="["$2"]"; $3=toupper($3); }1' OFS='' infile

및를 필드 구분 기호로 정의한 [...]후 두 번째 필드가 텍스트로 시작하는지 확인하고 그렇다면 두 번째 필드 주위에 다시 추가합니다 (이 문자를 왜곡하는 다른 열이 없다고 가정합니다. 그렇지 않으면 필드에서 이를 놓칠 것입니다). 그런 다음 세 번째 열을 대문자 값으로 변환합니다. 관용구는 기본 인쇄(항상 true인 조건)를 트리거하는 것입니다 .][United[]1awk

답변3

레코드의 두 번째 필드에 United가 있으면 awk먼저 현재 레코드에서 닫는 괄호의 위치를 ​​결정하여 이를 수행할 수 있습니다.

$ awk '
    $2 == "[United" {
      p = match($0, /]/)
      $0 = substr($0, 1, p-1) \
        toupper(substr($0, p))
    }1
' f1.txt

Posixly sed는 awk 솔루션과 동일한 라인을 따라 이 작업을 수행할 수 있습니다. 패턴 공간을 반으로 나누려면 ] 위치를 가져와 표시해야 합니다. 오른쪽 절반에는 이름이 있으며 y/// 명령을 통해 대문자로 표시합니다.

$ sed -e "
    /\[United[[:blank:]]/!b
   y/]/\n/
    h;s/.*\n//
    y/$(printf %s {a..z})/$(printf %s {A..Z})/
    x;s/\n.*//
    G
    y/\n/]/
" f1.txt
$ perl -pe 's/\[United\s+.*?]\K(.*)/\U$1/' f1.txt

관련 정보