텍스트 파일의 각 줄에 대해 세미콜론 뒤의 첫 번째 문자를 대문자로 만듭니다.

텍스트 파일의 각 줄에 대해 세미콜론 뒤의 첫 번째 문자를 대문자로 만듭니다.

이런 텍스트 파일이 있어요

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

GNU Sed:

sed 's/;[[:lower:]]/\U&/g' file

세미콜론( ) ;[[:lower:]]뒤의 모든 소문자는 대문자로 만듭니다.\U특별한 순서. 이 g플래그는 한 줄의 모든 항목을 대체합니다.

GNU Sed를 사용할 수 없는 경우 POSIX 호환 대안을 사용할 수 있습니다.전임자.

printf '%s\n' '%s/;[[:lower:]]/\U&/g' '%p' | ex file

대체 명령은 동일하지만 모든 행을 주소 지정에 사용해야 합니다 %. %p인쇄물. 파일을 직접 %p수정 하려면 x.

답변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.

https://raku.org

관련 정보