] 뒤의 첫 글자를 대문자로 변경하세요.

] 뒤의 첫 글자를 대문자로 변경하세요.

다음과 같은 수천 개의 행이 포함된 CSV 파일이 있습니다.

bla bla blab [FR] john is bla bla
bla [US] blue house in Chicago...
[ES] accessing the safe... bla bla

사이에 있는 요소를 확인하세요 [ ]. 이러한 요소 뒤에는 항상 공백과 새 문구의 시작 부분이 옵니다. 파일이 다음과 같이 보이도록 공백 뒤의 첫 글자를 대문자로 변환하고 싶습니다.

bla bla blab [FR] John is bla bla
bla [US] Blue house in Chicago...
[ES] Accessing the safe... bla bla

sed, awk 또는 기타 수단을 사용하여 터미널에서 이 작업을 어떻게 수행합니까?

해결책을 설명해주세요. 이해하고 배우고 싶습니다.

감사해요.

답변1

POSIXly에서는 다음과 같이 할 수 있습니다.

awk -F '] ' '{
  out = $1
  for (i = 2; i <= NF; i++)
    out = out FS toupper(substr($i, 1, 1)) substr($i, 2)
  print out}' < infile

또는:

awk '
  BEGIN {FS = OFS = "] "}
  {
    for (i = 2; i <= NF; i++)
      $i = toupper(substr($i, 1, 1)) substr($i, 2)
    print
  }' < infile

이는 필드 구분 기호 "] "로 정의되며 F각 필드의 첫 번째 문자(nd부터 시작하여 필드 번호까지)를 변환한 후 S필드를 다시 결합합니다.2NFNFto upper

(그러나 FreeBSD awk(및 macOS)를 포함한 일부 구현은 아직 국제화되지 않았으므로 사전 구성된 형식(U+00E9)으로 변경(또는 if로 변경)할 수 없습니다.mawkawk[GR] π[GR] Π[FR] éric[FR] Éricé

답변2

GNU 시스템에서는 다음을 사용할 수 있습니다 sed.

sed 's/] ./\U&/g' <infile

에스트레메편집하다이토르에스대안/무엇을 교체할 것인가/사용. . . 교체/G전역'<입력 파일

여기"무엇을 교체할 것인가"는 리터럴 ]이고 공백과 문자( .는 ewline을 제외한 단일 문자와 일치하지만 \newline 문자가 패턴 공간에서 발견되면 ewline 문자와 일치합니다. 플래그가 정규 표현식에 추가되지 않는 한, 그렇지 않으면 ewline 문자와 일치합니다. 일치하지 않습니다.)\nperls

"무엇을 교체할 것인가" is 는 \U&sed에서 &"replace-what" 부분(표시됨)에 대한 역참조이므로 일치하는 부분은 대문자로 대체됩니다.\U\Upper-case\U&


sedGNU가 아닌 경우 sed다음과 같이 동일한 작업을 수행할 수 있습니다 perl.

perl -Mopen=locale -pe 's/] ./\U$&/g' < infile

답변3

먼저 FS를 설정할 수 있습니다. -v FS="[]][[:space:]]+"즉, 다음과 같이 []]설정 [[:space:]]+하면 변경된 필드를 얻을 수 있습니다.

$ awk -v FS="[]][[:space:]]+" '{print  $2}' file
john is bla bla
blue house in Chicago...
accessing the safe... bla bla

여기에서는 "공백 뒤에 있는 첫 번째 문자를 대문자로 변환"하려고 하므로 다음을 테스트할 수 있습니다.

awk -v FS="[]][[:space:]]+" '{print toupper(substr($2,1,1))substr($2,2)}'  file

John is bla bla
Blue house in Chicago...
Accessing the safe... bla bla

모두 인쇄하십시오.

$ awk -v FS="[]][[:space:]]+" '{print $1, toupper(substr($2,1,1))substr($2,2)}'  file
bla bla blab [FR John is bla bla
bla [US Blue house in Chicago...
[ES Accessing the safe... bla bla

하지만 문제가 있습니다. 구분 문자가 누락되었습니다. 이러한 경우 함수의 네 번째 매개변수를 사용하여 함수에 split()삽입 할 수 있습니다. FS따라서 변경 사항과 원하는 결과를 얻을 수 있습니다.

awk -v FS="[]][[:space:]]+" '                                              
{
split($0, a, FS, seps)
a[i]=$1
a[2]= toupper(substr($2,1,1))substr($2,2)
for (i=1; i<=NF; i++)
printf "%s%s", a[i], seps[i]
print ""
  }
' file
bla bla blab [FR] John is bla bla
bla [US] Blue house in Chicago...
[ES] Accessing the safe... bla bla

코드를 작성해주신 Ed Morton에게 감사드립니다.https://stackoverflow.com/a/22211988여기에서 자세한 내용을 볼 수 있습니다.

관련 정보