expressão regular para extrair informações no shell script

3

Gostaria de fazer algumas partes de algumas saídas do comando shell no shell script:

$ uname -r
>> 3.14.37-1-lts

Onde eu só preciso do 3.14.37 .

E também para a variável de script shell VERSION que tem o valor "-jwl35", gostaria de obter apenas o valor "jwl35".

Como posso usar expressões regulares para isso no script de shell?

Obrigado antecipadamente!

    
por Jialun Liu 29.03.2015 / 17:34

2 respostas

9

Muitas e muitas maneiras. Aqui estão alguns:

  1. GNU Grep

    $ echo 3.14.37-1-lts | grep -oP '^[^-]*'
    3.14.37
    
  2. sed

    $ echo 3.14.37-1-lts | sed 's/^\([^-]*\).*//'
    3.14.37
    
  3. Perl

    $ echo 3.14.37-1-lts | perl -lne '/^(.*?)-/ && print $1
    3.14.37
    

    ou

    $ echo 3.14.37-1-lts | perl -lpe 's/^(.*?)-.*/$1/'
    3.14.37
    

    ou

    $ echo 3.14.37-1-lts | perl -F- -lane 'print $F[0]'
    3.14.37
    
  4. awk

    $ echo 3.14.37-1-lts | awk -F- '{print $1}'
    3.14.37
    
  5. cut

    $ echo 3.14.37-1-lts | cut -d- -f1
    3.14.37
    
  6. Shell, até mesmo!

    $ echo 3.14.37-1-lts | while IFS=- read a b; do echo "$a"; done
    3.14.37
    
por 29.03.2015 / 17:49
1

Uma abordagem não coberta pela resposta abrangente do terdon é o expansão do parâmetro (que não requer nenhum processo adicional):

vers=$(uname -r) && printf "%s\n" "${vers%%-*}"
3.14.37

vers="-jwl35" && printf "%s\n" "${vers#*-}"
jwl35
    
por 30.03.2015 / 03:02