Expressão regular que ignora certos caracteres

3

Eu preciso encontrar uma expressão regular, que ignore certos caracteres para uso na ferramenta bib2bib. Por exemplo: eu preciso encontrar qualquer ocorrência da palavra "muller". Mas também uma string como    '' Olá, meu nome é Michael M \ 'uller, como vai você?' ' ou   '' Existe M \ "{u} ller ''

deve ser encontrado.

Edit: Eu preciso que isso funcione não apenas para "muller", mas dinamicamente para cada palavra.

    
por User133713 16.03.2015 / 22:21

3 respostas

3

Se você quiser remover itens como \" e \"{ e } , será necessário pré-processar seu arquivo de entrada com uma ferramenta como sed antes de alimentá-lo em bib2bib .

Exemplo:

 sed -e 's/\"\{\|\"\|\}// input.bib > input.bib.preprocessed

Ou para converter especificamente coisas como \"{u} em u :

 sed -e 's/\"{\(.\)}//' -e 's/\"//' input.bib > input.bib.preprocessed
    
por 16.03.2015 / 22:55
3

Uma solução totalmente portátil poderia se parecer com:

n='
';printf %s\n muller wright dummy >/tmp/patterns
tr '[:lower:][:upper:]' '[:upper:][:lower:]' </tmp/patterns |
paste '-d\n\n' - /tmp/patterns |
sed "N;s/./\$n&/;:ul$n s/\(\n\)\(.\)\(.*\n\)\(.\)//;tul"'
       s/\n//g;s/../[{}\"]*[&]/g'

A saída desse último sed se parece com:

[{}\"]*[mM][{}\"]*[uU][{}\"]*[lL][{}\"]*[lL][{}\"]*[eE][{}\"]*[rR]
[{}\"]*[wW][{}\"]*[rR][{}\"]*[iI][{}\"]*[gG][{}\"]*[hH][{}\"]*[tT]
[{}\"]*[Dd][{}\"]*[uU][{}\"]*[Mm][{}\"]*[mM][{}\"]*[Yy]

Isso dependeria do conteúdo de padrões sendo apenas caracteres alfanuméricos. Se padrões continham, por exemplo, [] , seriam necessários mais testes para garantir que os colchetes fossem colocados corretamente cada um dentro de suas respectivas expressões de colchetes.

Em qualquer caso, com base no exemplo em questão:

[{}\"]*[mM][{}\"]*[uU][{}\"]*[lL][{}\"]*[lL][{}\"]*[eE][{}\"]*[rR]

... é um regexp que corresponderá a uma linha contendo qualquer um muller ou Muller ou M"ulL\\{"er .

Com o% GNUsed, você pode manipular as conversões de casos dentro de sed , portanto:

sed -E 's/([[:upper:]]?)([[:lower:]]?)/\L\U/g' patterns

... imprime ...

mMuUlLlLeErR
wWrRiIgGhHtT
DduUMmmMYy

... totalmente desenvolvido, você pode obter o mesmo comportamento que a combinação anterior tr|paste|sed (exceto que, assim, o problema de colchetes quadrados acima mencionado é tratado corretamente) com apenas GNU sed como:

sed -E '
    s/([[:lower:]]?)([[:upper:]]?)/\U\L/g
    s/[[:alpha:]]{2}|./[{}\"]*[&]/g
' </tmp/patterns
    
por 16.03.2015 / 23:43
0

Você não mencionou de que maneira tem seus dados disponíveis. Para remover linhas contendo os padrões postados, você pode usar grep :

grep -v -E '(muller|M\"uller|M\"{u}ller)'

(Note que o \ precisa de outro escape.) Para coincidir com o inverso, as linhas com os padrões fornecidos, omitem o -v .

Para definir as expressões regulares em um arquivo, use a opção grep de -f , como em:

grep -v -E -f file-with-regexps

Espera um regexp por linha nesse arquivo.

    
por 16.03.2015 / 22:29