シェルスクリプトから情報を抽出する正規表現

シェルスクリプトから情報を抽出する正規表現

シェルスクリプトからいくつかのシェルコマンドの出力の特定の部分をgrepしたいと思います。

$ uname -r
>> 3.14.37-1-lts

私はちょうど場所が必要です3.14.37

値が「-jwl35」のシェルスクリプト変数の場合は、VERSION「jwl35」値のみを使用したいと思います。

シェルスクリプトで正規表現を使用する方法は?

よろしくお願いします!

答え1

非常に多くの方法があります。以下は一部です。

  1. GNUグレブ

    $ 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. パール

    $ 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. アッ

    $ 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

扱わない方法Teddenの包括的な答えバッシュのものです。パラメータ拡張(追加プロセスは不要):

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

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

関連情報