私はsedで数字を抽出しようとします:
echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'
しかし結果は: 5 抽出方法: 678 と 45? 前もって感謝します!
問題は、.
in.*
が数字と非数字の両方に一致し、可能な限り一致し続けることです。つまり、に一致する可能性のある未消費の数字が1つ残っている限り[0-9]
です。
数字を抽出する代わりに、数字以外を削除するだけです。
echo hgdfjg678gfdg kjg45nn | sed 's/[^0-9]//g'
あるいは
echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9
これには、オプション-oを指定してgrepを使用できます。
$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45
または使用tr
:
$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45
.*
sed
貪欲です。そして、non-greedy
AFAIKのオプションはありません。
(この場合、貪欲でないマッチングのために使用する必要があります[^0-9]*
。ただし、これは一度しか機能しないため、678
なしでしか得られません45
。)
のみを使用する必要がある場合sed
、結果を取得するのは簡単ではありません。
gnuの使用をお勧めしますgrep
$ echo hgdfjg678gfdg kjg45nn | grep -oP '\d+'
678
45
本当に固執したい場合sed
、これは多くの可能な答えの1つです.
$ echo hgdfjg678gfdg kjg45nn | \
sed -e 's/\([0-9^]\)\([^0-9]\)/\1\n\2/g' | \
sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p’
678
45