Substituir maiúsculas por minúsculas, exceto a primeira letra de cada palavra na linha específica

6

Eu quero substituir os nomes que recebi apenas em letras maiúsculas. Os nomes são misturados com outras informações que devem permanecer como estão. AUTH: no início da linha identifica-a como uma linha onde os nomes devem ser substituídos.

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

Deve então ser

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

A minha pergunta está relacionada, mas é diferente da questão do Unix " Minúscula, exceto a primeira letra (maiúscula) de UPPERCASE em cirílico " porque eu uso letras romanas e não adoto as soluções propostas.

Para obter a linha respectiva, eu uso egrep -rl ^"AUTH:" e, em seguida, sigo com | xargs sed -r -i '/(AUTH:)/ ??? //g' onde não sei o que substituir ??? por.

    
por MERose 17.12.2014 / 18:31

3 respostas

4
> sed '/^AUTH/{s/^AUTH: //;s/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\L/g;s/^/AUTH: /;}' file
TITLE: Average title
AUTH: Superman
AFF: Something
AUTH: The New One
AFF: Berlin
AUTH: Mars-Mensch
AFF: Planet Mars
    
por 17.12.2014 / 18:44
3
sed -e '/^AUTH:\([^[:alpha:]]*\)/!b' -e 'h;s///;x;s///                                                                  
    s/\([[:alpha:]]\)\([[:alpha:]]*[^[:alpha:]]*\)//g;x;s//\
/g
    y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G;:l
    s/\n\(.*\n\)\(.\)//;tl
    s/\(.*\)\n/AUTH:/
'<<\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

Possivelmente para traduzir caracteres com sed , é necessário usar o comando y/// translate e definir explicitamente cada caractere a ser traduzido. Isso realmente vem a calhar - há muito pouca confusão e / ou adivinhação dessa maneira.

Este script divide cada linha AUTH: em dois bits - Um obtém o primeiro caractere alfabético em qualquer série de um ou mais caracteres alfabéticos substituídos por um \n ewline. O outro bit consiste em nada além daqueles primeiros alfabéticos e é h eld enquanto a linha é traduzida. Após a conversão sed G ets o bit mantido, e substitui cada caractere% ewline \n pelo primeiro caractere após o último \n ewline em um loop até que nenhum permaneça.

Aqui está um l ook no que a linha Lorem Ipsum acima parece um pouco antes de sed iniciar o loop de substituição:

 \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$

O bit AUTH: é removido quando a linha é confirmada - é reinserida por último - e por isso não está lá, mas o espaço que a segue - e quaisquer outros caracteres que possam existir entre eles existe. Você pode ver que todas as palavras começam com \n ewlines - sed negocia essas para cada caractere na sequência após a última. sed não faz distinção entre letras maiúsculas e minúsculas ao salvar a primeira letra de cada palavra - todas são colocadas de lado e substituídas mais tarde.

OUTPUT:

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.
    
por 18.12.2014 / 01:09
1

Com versões recentes do GNU sed :

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

Com versões mais antigas:

sed -r '/^AUTH:/!b;s/([^[:alnum:]:])([[:alnum:]]+)/\L\u/g'
    
por 18.12.2014 / 11:35