正则表达式在shell脚本中提取信息

正则表达式在shell脚本中提取信息

我想在 shell 脚本中 grep 某些 shell 命令输出的某些部分:

$ uname -r
>> 3.14.37-1-lts

我只需要的地方3.14.37

对于VERSION值为“-jwl35”的 shell 脚本变量,我只想采用值“jwl35”。

如何在 shell 脚本中使用正则表达式?

提前致谢!

答案1

很多很多方式。以下是一些:

  1. GNU Grep

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

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

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

    或者

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

    或者

    $ 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. 甚至是贝壳!

    $ echo 3.14.37-1-lts | while IFS=- read a b; do echo "$a"; done
    3.14.37
    

答案2

未涵盖的一种方法特登的全面回答是巴什的参数扩展(不需要额外的过程):

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

vers="-jwl35" && printf "%s\n" "${vers#*-}"
jwl35

相关内容