Regex para lista [[: alnum:]] * separada por pipe

0

qual é o regex confiável para strings [[:alnum:]]* separadas por pipe definidas em uma variável? o regex também deve cobrir maiúsculas e minúsculas quando a variável não está definida.

aceito:

var="abc123|A1B2C3|sDsdSS|"
var="abc123|A1B2C3"
var="abc123"
var=""

e provavelmente também alguns pipes supérfluos estão ok (suportado no meu grep ):

var="|||r44fDs||fe4REee|||"

Estou usando essa lista "var" mais tarde no meu script para excluir determinadas linhas do arquivo de entrada:

grep -vE "^(${var}) " input > input.filtered

Meu regex retorna também caracteres separados por espaços e especiais que não são aceitáveis para mim:

$ echo -e "sfsfds|sfsf|sfdsf|||\ns@ds|fsfsf|fssfsdf|sfsdfdfs\nsdfsdfsfs\nafafafs sdfsfd dfsfsfs\n"|grep -E '([[:alnum:]]*\|*)*'
sfsfds|sfsf|sfdsf|||
s@ds|fsfsf|fssfsdf|sfsdfdfs
sdfsdfsfs
afafafs sdfsfd dfsfsfs

$
    
por DonJ 18.03.2018 / 13:11

3 respostas

1

Apenas:

grep -x '[[:alnum:]|]*'

Ou seja, qualquer sequência de 0 ou mais alnums ou | . Você não precisa de regexps estendidos ( -E ) aqui. Essa sintaxe é válida em regexps básicos e estendidos (e PCRE e a maioria dos outros regexps, a única coisa que pode não ser suportada em alguns seria a classe de caracteres [:alnum:] POSIX).

A única coisa que faltava na sua era a opção -x para forçar o regexp a combinar na linha como um todo, ao invés de encontrar correspondências dentro da linha. O aninhamento de expressões regulares foi um exagero. Você precisaria disso se quisesse que os campos delimitados por | não estivessem vazios:

grep -xE '[[:alnum:]]+(\|[[:alnum:]]+)*'

O que também pode ser feito com REs básicos, embora de forma menos legível:

grep -x '[[:alnum:]]\{1,\}\(|[[:alnum:]]\{1,\}\)*'
    
por 18.03.2018 / 15:01
0

grep solução:

Amostra input.txt :

sfsfds|sfsf|sfdsf|||
s@ds|fsfsf|fssfsdf|sfsdfdfs
sdfsdfsfs
afafafs sdfsfd dfsfsfs
var='^[[:alnum:]]+[[:alnum:]\|]*$'
grep -E "$var" input.txt

A saída:

sfsfds|sfsf|sfdsf|||
sdfsdfsfs
    
por 18.03.2018 / 13:56
0

Isso deve funcionar:

var='^[[:alnum:]|]*$'
    
por 18.03.2018 / 14:37