私はこれが非常に簡単な質問だと思い、Googleが質問の一部に多くの回答を見つけましたが、一緒に接続しようとするとうまくいかず、理由を理解できません。
シナリオは次のとおりです。
- テキストの多いファイルがあります。
- 行の1つが次のパターンと一致します。
foo = 1700;
- 抽出したい
1700
- 後でスクリプトで参照できるようにbashスクリプト変数に保存したいと思います。
3段階を超えられません。私が試したことは次のとおりです。
sed -nE 's/^foo = //p' file | sed -nE 's/;//p'
これは次のように印刷されます。
1700
大丈夫です。しかし、空白などを整える必要がある場合はどうすればいいですか?*
/が利用できない場合は+
どうすればいいのかわかりません。他の回答を使用*
/+
置き換えることができないことを理解しているので、これを行う方法がわかりません。 grepのマニュアルページを見ましたが、その用語を検索してもグループオプションは表示されません。私はawkでこの問題を解決する方法を知っていると思いますが、常に正規表現関数が少し不明瞭であり、コマンドラインスクリプトにエスケープが多すぎるため、理想的にはこれがこの問題を解決する唯一の方法ではありません。 。
ベストアンサー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キャプチャグループにのみ置き換えようとし、成功すると修正された行を印刷します。
sed
次に、出力を変数に入れたいです。あなたはこれでやるコマンドの置き換え。例えば$ myvar=$(echo 'foo = 1700;' | sed -n -E -e 's/^foo = ([0-9]+).*/\1/p') $ echo $myvar 1700
スクリプトで使用するには、ファイルをパイプするのではなく、sedの引数として使用します
echo ...
。myvar=$(sed -n -E -e 's/^foo = ([0-9]+).*/\1/p' file)
スペースをトリミングしたり、オプションの
=
先行スペースや周囲のオプションのスペースなどがある可能性がある行を処理します。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)