다음과 같은 수천 개의 행이 포함된 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
필드를 다시 결합합니다.2
NF
N
F
to
upper
(그러나 FreeBSD awk
(및 macOS)를 포함한 일부 구현은 아직 국제화되지 않았으므로 사전 구성된 형식(U+00E9)으로 변경(또는 if로 변경)할 수 없습니다.mawk
awk
[GR] π
[GR] Π
[FR] éric
[FR] Éric
é
답변2
GNU 시스템에서는 다음을 사용할 수 있습니다 sed
.
sed 's/] ./\U&/g' <infile
에스트레메편집하다이토르에스대안/무엇을 교체할 것인가/사용. . . 교체/G전역'<입력 파일
여기"무엇을 교체할 것인가"는 리터럴 ]
이고 공백과 문자(
.
는 ewline을 제외한 단일 문자와 일치하지만 \n
ewline 문자가 패턴 공간에서 발견되면 ewline 문자와 일치합니다. 플래그가 정규 표현식에 추가되지 않는 한, 그렇지 않으면 ewline 문자와 일치합니다. 일치하지 않습니다.)\n
perl
s
"무엇을 교체할 것인가" is 는 \U&
sed에서 &
"replace-what" 부분(표시됨)에 대한 역참조이므로 일치하는 부분은 대문자로 대체됩니다.\U
\Upper-case
\U&
sed
GNU가 아닌 경우 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여기에서 자세한 내용을 볼 수 있습니다.