특정 줄의 각 단어의 첫 글자를 제외하고 대문자를 소문자로 바꿉니다.

특정 줄의 각 단어의 첫 글자를 제외하고 대문자를 소문자로 바꿉니다.

대문자로만 받은 이름을 바꾸고 싶습니다. 이러한 이름은 다른 정보와 혼합되어 있으므로 그대로 두어야 합니다. AUTH:줄의 시작 부분에서 이름을 바꿔야 하는 줄로 식별합니다.

TITLE: Average title
AUTH: SUPERMAN
AFF: Something
AUTH: THE NEW ONE
AFF: Berlin
AUTH: MARS-MENSCH
AFF: Planet Mars

그럼 그래야지

TITLE: Average title
AUTH: Superman
AFF: Something
AUTH: The New One
AFF: Berlin
AUTH: Mars-Mensch
AFF: Planet Mars

내 문제는 Unix 문제와 관련이 있지만 다릅니다."키릴 알파벳의 첫 번째(대문자) 문자를 제외한 모든 문자를 소문자로 만듭니다."로마자를 사용하다가 제안된 솔루션을 적용하지 못했기 때문입니다.

내가 사용하는 해당 행을 얻으려면 무엇으로 바꿀지 모르는 부분을 egrep -rl ^"AUTH:"따르십시오 .| xargs sed -r -i '/(AUTH:)/ ??? /\1/g'???

답변1

> sed '/^AUTH/{s/^AUTH: //;s/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\1\L\2/g;s/^/AUTH: /;}' file
TITLE: Average title
AUTH: Superman
AFF: Something
AUTH: The New One
AFF: Berlin
AUTH: Mars-Mensch
AFF: Planet Mars

답변2

sed -e '/^AUTH:\([^[:alpha:]]*\)/!b' -e 'h;s//\1/;x;s///                                                                  
    s/\([[:alpha:]]\)\([[:alpha:]]*[^[:alpha:]]*\)/\1/g;x;s//\
\2/g
    y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G;:l
    s/\n\(.*\n\)\(.\)/\2\1/;tl
    s/\(.*\)\n/AUTH:\1/
'<<\IN
TITLE: Average title
AUTH: SUPERMAN
AFF: Something
AUTH: THE NEW ONE
AFF: Berlin
AUTH: MARS-MENSCH
AFF: Planet Mars
AUTH: CONTRARY tO pOPULAR bELIEF, Lorem Ipsu'M is not simply random text. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance.                        
IN

문자를 이식 가능하게 번역하려면 번역 명령을 sed사용하고 번역할 각 문자를 명시적으로 설정해야 합니다 . y///이것은 실제로 매우 잘 작동합니다. 혼란이나 추측이 적습니다.

이 스크립트는 각각권한 부여:줄을 두 자리로 분할 - 하나 이상의 알파벳 문자로 구성된 일련의 첫 번째 알파벳 문자를 ewline 으로 바꿉니다 \n. 다른 비트는 해당 첫 글자만 포함하며 h행이 번역될 때 필드에 있습니다. 변환 후 sed Gets는 비트를 유지하고 \n각 ewline 문자를 아무것도 남지 않을 때까지 루프의 마지막 ewline 다음의 첫 번째 문자로 바꿉니다.\n

이게 뭐야 l?로렘 입숨sed위의 줄은 교체 루프가 시작되기 직전 과 같습니다 .

 \nontrary \no \nopular \nelief, \norem \npsum \ns \not \nimply \nand\
om \next. \norem \npsum \nomes \nrom \nections 1.10.32 \nnd 1.10.33 \
\nf "\ne \ninibus \nonorum \nt \nalorum" (\nhe \nxtremes \nf \nood \n\
nd \nvil) \ny \nicero, \nritten \nn 45 \nc. \nhis \nook \ns \n \nreat\
ise \nn \nhe \nheory \nf \nthics, \nery \nopular \nuring \nhe \nenais\
sance.\nCtpbLIinsrtLIcfsaodFBeMTEoGaEbCwiBTbiatottoevpdtR$

이것권한 부여:줄이 승인되면 해당 비트가 제거되어 마지막에 다시 삽입되었으므로 거기에는 없지만 그 뒤의 공백과 그 사이에 나타날 수 있는 다른 문자가 있습니다. 모든 단어가 \newlines로 시작하는 것을 볼 수 있습니다 . 즉, sed마지막 문자 이후 문자열의 모든 문자를 순서대로 바꾸는 것입니다. sed각 단어의 첫 글자는 대소문자를 구분하지 않고 저장됩니다. 따로 보관해 두었다가 나중에 교체합니다.

산출:

TITLE: Average title
AUTH: Superman
AFF: Something
AUTH: The New One
AFF: Berlin
AUTH: Mars-Mensch
AFF: Planet Mars
AUTH: Contrary to popular belief, Lorem Ipsu'M is not simply random text. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 Bc. This book is a treatise on the theory of ethics, very popular during the Renaissance.

답변3

최신 버전의 GNU를 사용하세요 sed:

sed -E '/^AUTH:/!b;s/([^\w:])(\w+)/\1\L\u\2/g'

이전 버전의 경우:

sed -r '/^AUTH:/!b;s/([^[:alnum:]:])([[:alnum:]]+)/\1\L\u\2/g'

관련 정보