正規表現のさまざまな結果(grepを使用)を変数として取得するにはどうすればよいですか?

正規表現のさまざまな結果(grepを使用)を変数として取得するにはどうすればよいですか?

問題の簡単な説明

文字列が与えられたら、正規表現に基づいて複数の部分文字列を取得する方法は?

echo "hello world 15 42" | grep -P ".*([0-9]+) ([0-9]+)";

残念ながら、これはそれぞれ15と42の代わりに完全に一致する文字列を返します。理想的には、一部の変数はそれを復元して使用できるようにします。

echo "First: $0, Second: $1"; # echo is only an example

もっと文脈

インストールスクリプトの場合、URLからファイルをダウンロードする必要があります(wgetを使用)、具体的なファイル名は不明であるため、スクリプトはまずindex.htmlをダウンロードしてファイル名の抽出、バージョン番号の抽出、および再構成を行う必要があります。完全なURL。

wget 2>/dev/null -O - http://...../directory/ | grep -P "<a href=....
wget "http://..../directory/file-$1-revision-$2.gz" -O downloaded.gz

ベストアンサー1

Bash 正規表現を使用して組み込み BASH_REMATCH 配列を照合してアクセスします。

s="hello world 15 42"
re='.*([0-9]+) ([0-9-]+)'
if [[ $s =~ $re ]]; then
    for key in "${!BASH_REMATCH[@]}"; do 
        printf "%s\t%s\n" "$key" "${BASH_REMATCH[$key]}"
    done
fi
0   hello world 15 42
1   5
2   42

おすすめ記事