
問題の簡単な説明
文字列が与えられたら、正規表現に基づいて複数の部分文字列を取得する方法は?
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
答え2
> greparray=($(echo "hello world 15 42" | grep -Eo "[0-9]+ [0-9]+"))
> echo ${greparray[1]}
42
答え3
配列を使用します。
myArray=($(echo "hello world 15 42" | egrep -o '([0-9]+)'))
最初の部分文字列にアクセスします。
echo ${myArray[0]}
15
...2番目:
echo ${myArray[1]}
42