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
[]
1
awk
답변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