expr index [RESOLVIDO]

1. expr index [RESOLVIDO]

Arthur Rodrigues Stilben
gugarthur

(usa Fedora)

Enviado em 16/03/2015 - 13:34h

Pessoal, estou com uma dúvida. Se eu executo o comando:

expr index "ab" b 


O resultado é 2. Agora se executo:

expr index "áb" b 


O resultado é 3. Gostaria de saber por que isso ocorre e, no caso de uma lista de strings, algumas contendo acento e outras não, como poderia fazer para não ter essa divergência de resultados?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/03/2015 - 16:11h

O awk reconhece locales diferentes de "C"/"POSIX". Minha configuração default de locale é LC_ALL=en_US.UTF-8. Eis alguns resultados.

$ awk 'BEGIN { print index("ab", "b"); }'
2
$ awk 'BEGIN { print index("áb", "b"); }'
2
$ env LC_ALL=C awk 'BEGIN { print index("áb", "b"); }'
3


3. Re: expr index

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/03/2015 - 13:54h

Aparentemente o expr não suporta UTF-8 -- provavelmente não suporta locale alguma além da padrão ("C" ou "POSIX").

Será que a versão do expr distribuída com o o Plan 9, que supostamente trabalha com UTF-8 universalmente, suporta?


4. Re: expr index [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 16/03/2015 - 14:16h


Tentei reproduzir o seu problema no Debian e Red hat e não consegui, sempre da 2.

Red hat
# expr index "áb" b
2

expr --version
expr (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Parker, James Youngman, and Paul Eggert.

Debian
# expr index "áb" b
2

expr (GNU coreutils) 6.10
Copyright (C) 2008 Free Software Foundation, Inc.
Licença GPLv3+: GNU GPL versão 3 ou posterior <http://gnu.org/licenses/gpl.html>
Isto é software livre: pode alterá-lo e redistribuí-lo.
NÃO Hà GARANTIA, até onde a lei o permite.

Escrito por Mike Parker.



5. Re: expr index [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/03/2015 - 14:49h

fdmarp escreveu:

Tentei reproduzir o seu problema no Debian e Red hat e não consegui, sempre da 2.


Quais os valores das suas variáveis de ambiente LANG, LC_CTYPE e LC_ALL?


6. Re: expr index [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/03/2015 - 10:05h

paulo1205 escreveu:

Será que a versão do expr distribuída com o o Plan 9, que supostamente trabalha com UTF-8 universalmente, suporta?


Eu instalei o pacote plan9-base no Ubuntu, e ele não traz o expr.

Para referência, eis a listagem de um programinha que faz o papel da função index, com suporte a caracteres acentuados, em C (com a diferença de que os offsets começam a ser contados em 0, em vez de 1, e -1 indica que o padrão não foi encontrado).

// index.c -- compile usando “gcc -std=c99 index.c -o index”
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <wctype.h>

int main(int argc, char **argv){
wchar_t *haystack, *needle, *found;
size_t haystack_len, needle_len;

if(argc!=3){
fprintf(stderr, "usage: %s haystack needle\n", argv[0]);
return 1;
}

// Usa variáveis de ambiente para definir locale.
setlocale(LC_ALL, "");

haystack_len=strlen(argv[1]);
needle_len=strlen(argv[2]);

haystack=calloc(1+haystack_len, sizeof *haystack);
needle=calloc(1+needle_len, sizeof *needle);

mbsrtowcs(haystack, (const char **)&argv[1], haystack_len, NULL);
mbsrtowcs(needle, (const char **)&argv[2], needle_len, NULL);

found=wcsstr(haystack, needle)-haystack;
printf("%zd\n", found? found-haystack: -1);

return found==NULL;
}



7. Re: expr index [RESOLVIDO]

Arthur Rodrigues Stilben
gugarthur

(usa Fedora)

Enviado em 17/03/2015 - 10:14h

fdmarp,

o meu sistema é o Fedora 21.


$expr index áb b
3
$ expr index ab b
2



$ expr --version
expr (GNU coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
Licença GPLv3+: GNU GPL versão 3 ou posterior <http://gnu.org/licenses/gpl.html>
Este é um software livre: você é livre para alterá-lo e redistribuí-lo.
NÃO HÁ GARANTIA, na máxima extensão permitida pela lei.

Escrito por Mike Parker, James Youngman e Paul Eggert.



8. Re: expr index [RESOLVIDO]

Arthur Rodrigues Stilben
gugarthur

(usa Fedora)

Enviado em 17/03/2015 - 10:17h

paulo1205,


$ echo "LANG: $LANG
> LC_CTYPE: $LC_CTYPE
> LC_ALL: $LC_ALL"
LANG: pt_BR.utf8
LC_CTYPE:
LC_ALL:




9. Re: expr index [RESOLVIDO]

Arthur Rodrigues Stilben
gugarthur

(usa Fedora)

Enviado em 17/03/2015 - 11:08h

paulo1205 escreveu:

O awk reconhece locales diferentes de "C"/"POSIX". Minha configuração default de locale é LC_ALL=en_US.UTF-8. Eis alguns resultados.

$ awk 'BEGIN { print index("ab", "b"); }'
2
$ awk 'BEGIN { print index("áb", "b"); }'
2
$ env LC_ALL=C awk 'BEGIN { print index("áb", "b"); }'
3


Vlw, paulo, pela ajuda. Funcionou direitinho.









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts