Regex não funciona com grep

2

Eu tenho uma string como essa

TEST="/dev/sda1 on /media/sda1 type vfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,quiet)"

(Resultado de mount | grep sda1 )

onde eu quero corresponder ao ponto de montagem. Meu regex ( adotado aqui ) é

(?<=on[ \t])(.*)(?=[ \t]type)

Mas, por alguns motivos, isso não funciona para mim com várias ferramentas (Busybox ash 1.14.2):

echo $TEST | grep -o -e '(?<=on[ \t])(.*)(?=[ \t]type)'

Não me dá resultado.

echo $TEST | awk 'match($0, /(?<=on )(.*)(?= type)/){print $0}'

Retorna um erro awk: bad regex '(?<=on[ ])(.*)(?=[ ]type)': Invalid preceding regular expression

expr match "$TEST" '\(?<=on[ \t]\)\(.*\)\(?=[ \t]type\)'

Também retorna um resultado vazio.

Eu me sinto meio idiota.

    
por Noir 22.04.2014 / 15:10

1 resposta

7

Lookarounds são recursos perl regex. O GNU grep os implementa (com a opção -P ). Não sei dizer se algum comando busybox faz isso.

Neste caso, você está apenas procurando pelo trabalho depois de "on". Escolha um dos

echo "$TEST" | awk '{for (i=1; i<=NF; i++) if ($i == "on") {print $(i+1); break}}'
echo "$TEST" | sed 's/.*on[[:blank:]]\(.*\)[[:blank:]]type.*//'
    
por 22.04.2014 / 15:29