이런 텍스트 파일이 있어요
John Doe;john Doe is ...;he lives in ...
Mike Nelson;mike Nelson works for ...;he makes ...
Marcy William;marcy's mother is ...;marcy travels a lot...
세미콜론 뒤의 모든 문자를 대문자로 변환하고 싶으므로 최종 결과는 다음과 같습니다.
John Doe;John Doe is ...;He lives in ...
Mike Nelson;Mike Nelson works for ...;He makes ...
Marcy William;Marcy's mother is ...;Marcy travels a lot...
나머지는 그대로 둡니다.
파일에는 악센트 문자가 포함되어 있으며 UTF-8로 인코딩됩니다.
답변1
답변2
awk나 sed가 아니라 Perl입니다.
perl -C -pe 's/;(.)/;\u$1/g'
이 -C
옵션은 로케일 환경 변수(등)에 따라 UTF-8 i/o를 켜거나 끕니다 LC_ALL
. 무조건 UTF-8 입력 및 출력을 사용하려면 로 변경하세요 -CSD
.
유니코드 대소문자 구분은 까다롭습니다. 그게 바뀔거야이산입력하다이산정확하다기보다는이산(터키어 이름은 대문자라도 i 위에 점이 있습니다.)
답변3
Perl을 사용하는 한 가지 방법은 다음과 같습니다.
perl -C -pe 's/;(.)/";" . uc($1)/eg' file
입력 파일에 악센트가 표시되지 않으므로 테스트에 이것을 사용했습니다.
$ cat file
John Doe;john Doe is ...;he lives in ...
Mike Nelson;mike Nelson works for ...;he makes ...
Émilie du Châtelet;émilie du Châtelet;works for ...;she makes ...
Marcy William;marcy's mother is ...;marcy travels a lot...
Άσπα Κυριάκου;άσπα's brother is ...; άσπα likes fish
다음을 생성합니다.
$ perl -C -pe 's/;(.)/";" . uc($1)/eg' file
John Doe;John Doe is ...;He lives in ...
Mike Nelson;Mike Nelson works for ...;He makes ...
Émilie du Châtelet;Émilie du Châtelet;Works for ...;She makes ...
Marcy William;Marcy's mother is ...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is ...; άσπα likes fish
설명하다
-C
:man perlrun
(세부 사항 참조) 기본적으로 이는 utf8을 활성화합니다.-pe
: 입력 파일을 한 줄씩 읽고 주어진 스크립트를 적용한 후 각 줄을 인쇄합니다e
.
s/old/new/flags
이 작업은 일반 형식이 . 인 대체 연산자 내에서 발생합니다 . 즉, 작동 방식을 재정의 old
하고 new
제어합니다 . flags
여기서 사용된 플래그는 e
대체에서 Perl 코드를 활성화하는 것입니다. g
이는 "이 줄의 모든 일치 항목에 적용"을 의미합니다.
;(.)
a 뒤에 있는 모든 문자를 캡처하여 ;
로 저장 합니다 $1
. 그런 다음 이를 a로 바꾸고 ;
해당 문자를 대문자( uc($1)
)로 변환합니다.
답변4
Raku(이전 Perl6) 사용
Perl6/Raku 프로젝트의 한 가지 장점은 처음부터 유니코드를 우아하게 처리하도록 설계되었다는 것입니다. 좋은 테스트 파일을 게시해 주신 @terdon에게 감사드립니다.
~$ raku -pe 's:g/ \;(.) /;{$0.uc}/;' terdon_uni.txt
John Doe;John Doe is ...;He lives in ...
Mike Nelson;Mike Nelson works for ...;He makes ...
Émilie du Châtelet;Émilie du Châtelet;Works for ...;She makes ...
Marcy William;Marcy's mother is ...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is ...; άσπα likes fish
위에서는 세미콜론 뒤의 첫 번째 문자 캡처를 볼 수 있습니다. 플래그 :g
( 의 줄임말 :global
)가 연산자의 선두로 이동하므로 s///
처음부터 우리가 찾고 있는 일치 항목이 무엇인지 알 수 있습니다. Raku start $0
, 등 의 캡처를 참고하세요 $1
. $2
연산자의 "일치"(왼쪽) 절반은 s///
공백을 허용하므로 가독성이 향상됩니다. 연산자의 "교체"(오른쪽) 부분은 종료를 나타내는 s///
데 사용됩니다 {…}
.
아래에서는 Raku의 캡처 태그를 사용하고 있습니다 <(…)>
. Raku의 <(…)>
외부 문자는 Perl5 플래그와 동일합니다 \K
. 일치는 이루어졌지만 <(…)>
마크는 라쿠에게 외부에 있는 모든 것을 버리고 <(…)>
내부(캡처)를 에 로드하라고 지시했습니다 $/
. Raku가 전체 일치를 수행하지만 변경하려는 정확한 문자만 캡처하므로 대체 작성이 크게 단순화됩니다.
~$ raku -pe 's:g/ \; <(.)> /{$/.uc}/;' terdon_uni.txt
John Doe;John Doe is ...;He lives in ...
Mike Nelson;Mike Nelson works for ...;He makes ...
Émilie du Châtelet;Émilie du Châtelet;Works for ...;She makes ...
Marcy William;Marcy's mother is ...;Marcy travels a lot...
Άσπα Κυριάκου;Άσπα's brother is ...; άσπα likes fish
HTH.