Expressão regular para palavras encapsuladas misturadas

2

Eu quero uma expressão regular que me ajude a identificar se um determinado padrão está presente como um caso misto em uma frase ou não.

Diga:

Fox juMPed the rock

Agora, quero descobrir que, se o padrão jumped tiver letras pequenas ou não. Como posso conseguir isso?

Deixe-me esclarecer um pouco. O que eu quero fazer é transformar as palavras-chave em um arquivo de código em MAIÚSCULAS. Para isso, preciso identificar as palavras-chave que ainda não estão em maiúsculas.

Como Replace , idealmente deveria ser REPLACE .

Mas para encontrar esses casos, eu deveria ser capaz de identificar se uma palavra tem ou não uma letra minúscula presente.

    
por haldar55 05.11.2014 / 06:13

5 respostas

1
printf %s\n 'juMPEd'| sed 's/[^[:lower:]]//g'

OUTPUT

jud
    
por 05.11.2014 / 06:19
0

O Perl pode fazer isso com bastante facilidade:

$ echo 'Fox juMPed the rock' | perl -pe 's/jumped/\U$&/i'
Fox JUMPED the rock

Ele procura jumped , não diferencia maiúsculas de minúsculas e a substitui pela versão maiúscula.

    
por 05.11.2014 / 06:49
0

Você pode usar o grep -ioE para obter todas as correspondências para um determinado regexp

$ echo "abc jumped def Jumped fgh JUMPED klm" > file.txt
$ grep -ioE "j\w+" file.txt > matches.txt
$ cat matches.txt
jumped
Jumped
JUMPED

Agora, você pode repetir o resultado e remover correspondências completas inferiores / superiores (bash):

$ for w in $(cat matches.txt); do if [[ ! $w == ${w^^} && ! $w == ${w,,} ]]; then echo $w; fi; done > mixed.txt
$ cat mixed.txt
Jumped

Para cada palavra misturada, você pode chamar sed para maiúsculas a correspondência dada

$ for w in $(cat mixed.txt); do sed -i "s:$w:${w^^}:g" file.txt; done
    
por 05.11.2014 / 06:53
0

Let me make it a little clearer. What I want is to make the keywords in a code file turn in UPPERCASE.

Nesse caso, não há necessidade de testar se uma palavra possui letras minúsculas. É mais fácil e, no final, mais eficiente substituir apenas todos eles.

$ echo Fox Jumped and JUMPED and juMPed the rock | sed 's/jumped/JUMPED/gi'
Fox JUMPED and JUMPED and JUMPED the rock

Refinamento: combine apenas palavras inteiras

Se quiser, pode insistir para que apenas palavras inteiras sejam substituídas:

sed 's/\<jumped\>/JUMPED/gi'

Como identificar qualquer ocorrência de um identificador que não esteja totalmente em maiúsculas

Usando grep -o

$ echo Fox Jumped and JUMPED and juMPed the rock | grep -woi jumped | grep '[[:lower:]]'
Jumped
juMPed

Dois comandos grep são usados. O primeiro faz uma busca sem distinção entre maiúsculas e minúsculas para a palavra inteira jumped e a segunda restringe as correspondências àquelas com pelo menos uma letra minúscula.

Usando awk

Este comando awk procurará qualquer ocorrência de palavra em maiúsculas e minúsculas:

awk -v 'RS=[^[:alnum:]]' 'tolower($0)=="jumped" && $0 ~ /[[:lower:]]/ {print $0}'

Aqui, as palavras são definidas para consistir em caracteres alfanuméricos. Se suas palavras permitirem mais caracteres, ajuste RS de acordo.

Como exemplo:

$ echo Fox Jumped and JUMPED and juMPed the rock | awk -v 'RS=[^[:alnum:]]' 'tolower($0)=="jumped" && $0 ~ /[[:lower:]]/ {print $0}'
Jumped
juMPed
    
por 05.11.2014 / 06:50
0

Isso pode ser feito inteiramente dentro do shell, com uma construção case .

string='Fox juMPed the rock'
case "$string" in
  *[:lower:]*) echo "The string contains lowercase letters.";;
esac

Em ksh, você pode usar typeset -u para converter uma string em maiúscula. Não importa se o original era todo em maiúsculas ou não.

string='Fox juMPed the rock'
typeset -u string
echo "SHOUTING: $string"

Se você quiser processar um arquivo, você pode usar o awk e sua função toupper para converter uma string em maiúscula. Você pode testar se s já é maiúscula com s == toupper(s) , embora você também deva usar toupper(s) .

    
por 07.11.2014 / 05:41