行から数値を抽出して変数に保存するには?

行から数値を抽出して変数に保存するには?

私はこれが非常に簡単な質問だと思い、Googleが質問の一部に多くの回答を見つけましたが、一緒に接続しようとするとうまくいかず、理由を理解できません。

シナリオは次のとおりです。

  1. テキストの多いファイルがあります。
  2. 行の1つが次のパターンと一致します。foo = 1700;
  3. 抽出したい1700
  4. 後でスクリプトで参照できるようにbashスクリプト変数に保存したいと思います。

3段階を超えられません。私が試したことは次のとおりです。

sed -nE 's/^foo = //p' file | sed -nE 's/;//p'

これは次のように印刷されます。

1700

大丈夫です。しかし、空白などを整える必要がある場合はどうすればいいですか?*/が利用できない場合は+どうすればいいのかわかりません。他の回答を使用*/+置き換えることができないことを理解しているので、これを行う方法がわかりません。 grepのマニュアルページを見ましたが、その用語を検索してもグループオプションは表示されません。私はawkでこの問題を解決する方法を知っていると思いますが、常に正規表現関数が少し不明瞭であり、コマンドラインスクリプトにエスケープが多すぎるため、理想的にはこれがこの問題を解決する唯一の方法ではありません。 。

ベストアンサー1

  1. まず、数値をキャプチャする方法を紹介します。

    $ echo 'foo = 1700;' | sed -n -e 's/^foo = \([0-9]\+\).*/\1/p'
    1700
    

    これはデフォルトsedの基本 Regular Expressions (BRE) を使用します。 sed-Eオプションで拡張正規表現(ERE)を使用することもできます。

    echo 'foo = 1700;' | sed -n -E -e 's/^foo = ([0-9]+).*/\1/p'
    1700
    

    [0-9]+括弧内のサブ式は(... )1つ以上の数字をキャプチャします。これは「キャプチャグループ」と呼ばれ、次に置き換えるために使用されます\1最初キャプチャグループ - キャプチャグループが複数ある場合は、\1、\2、\3などとして使用できます。

    この場合、sedスクリプトは行全体を\ 1キャプチャグループにのみ置き換えようとし、成功すると修正された行を印刷します。

  2. sed次に、出力を変数に入れたいです。あなたはこれでやるコマンドの置き換え。例えば

    $ myvar=$(echo 'foo = 1700;' | sed -n -E -e 's/^foo = ([0-9]+).*/\1/p')
    $ echo $myvar
    1700
    
  3. スクリプトで使用するには、ファイルをパイプするのではなく、sedの引数として使用しますecho ...

    myvar=$(sed -n -E -e 's/^foo = ([0-9]+).*/\1/p' file)
    
  4. スペースをトリミングしたり、オプションの=先行スペースや周囲のオプションのスペースなどがある可能性がある行を処理します。

    myvar=$(sed -n -E -e 's/^[[:space:]]*foo[[:space:]]*=[[:space:]]*([0-9]+).*/\1/p' file)
    

    sedの一部のバージョン(少なくともGNU sed、たぶん他のバージョン)はこれを理解しているperl's \sので、次のように短縮できます。

     myvar=$(sed -n -E -e 's/^\s*foo\s*=\s*([0-9]+).*/\1/p' file)
    

おすすめ記事