Sed Script para Capitalizar “I” em um arquivo de texto

2

Estou tentando criar um comando sed que capitalize o pronome I em um arquivo de texto. Por exemplo "eu gosto de cachorros" deve ser "Eu gosto de cachorros". Até agora eu tenho:

sed 's/ i / I /g'

Isso não funciona em vários cenários diferentes. Como se houvesse pontuação em torno do i .

Aqui está uma lista de cenários em que pensei que o comando deve ser capaz de lidar:

  • Existem vários ' i em uma linha de texto. Acho que isso pode ser resolvido apenas com o sinalizador g no final.
  • O ' i ' tem pontuação em torno dele. Por exemplo, uma vírgula ou ponto final após, ou uma citação ou parênteses antes ou depois.
  • O ' i ' é o primeiro ou último caractere na linha. Significa que você não pode apenas verificar o espaço em branco ou a pontuação em torno dele.
  • Qualquer ' i regular em uma palavra é deixado em paz. Por exemplo, "f i ref i ghter" não deve ser transformado em "f I ref I ghter" .
por nickeb96 05.10.2018 / 20:47

2 respostas

5

Supondo que você esteja usando o GNU sed, uma maneira é

sed 's/\([[:space:]]\|[[:punct:]]\)i\([[:space:]]\|[[:punct:]]\)/I/g'

ou algo parecido. Isso ainda deixa o caso da linha começando com 'eu gosto de cachorros' porque não há espaço antes do pronome. Uma maneira de corrigir isso é

sed 's/\(^\|[[:space:]]\|[[:punct:]]\)i\([[:space:]]\|[[:punct:]]\)/I/g'

Isso ainda deixa o caso quando você tem um 'i' consecutivo como em "ii", mas não consigo pensar em nenhuma razão para que isso ocorra no texto em inglês, exceto quando alguém erroneamente escreveu 'ii sir' quando a frase correta é "sim, sim senhor".

Há também arestas ásperas se você também usa numerais romanos em letras minúsculas. O script sed não será capaz de dizer se 'i' é um pronome ou o numeral romano, mas realmente não há uma boa solução para esse.

    
por 05.10.2018 / 21:28
2

Uma solução simples (com o GNU sed):

sed 's/\bi\b/I/g'

Este é basicamente o mesmo conceito que a outra resposta - substitua "i" por "I" quando não fizer parte de uma palavra maior. \b parece não ser mencionado na página do manual do sed mas é explicado em Manual GNU sed :

\b

    Matches a word boundary; that is it matches if the character to the left is a “word” character and the character to the right is a “non-word” character, or vice-versa.
    $ echo "abc %-= def." | sed 's/\b/X/g'
    XabcX %-= XdefX.
    

    Até o manual não diz explicitamente (mas o exemplo mostra) que \b corresponde ao início e ao final da linha. Não corresponde a nenhum caractere; ele corresponde à string nula que aparece entre um caractere de “palavra” e um caractere de “não palavra” (em qualquer ordem), ou no início e no final da linha (como ^ e $ ). Então, não precisamos nos preocupar com a captura (com \(\) ) os caracteres que eles correspondem e substituindo-os por e . E, como \b não corresponde a nenhum caractere, este comando funciona em i i (alterando para I I ).

        
    por 06.10.2018 / 08:40