12

私はsedで数字を抽出しようとします:

echo hgdfjg678gfdg kjg45nn | sed 's/.*\([0-9]\+\).*/\1/g'

しかし結果は: 5 抽出方法: 678 と 45? 前もって感謝します!

4

4 に答える 4

18

問題は、.in.*が数字と非数字の両方に一致し、可能な限り一致し続けることです。つまり、に一致する可能性のある未消費の数字が1つ残っている限り[0-9]です。

数字を抽出する代わりに、数字以外を削除するだけです。

echo hgdfjg678gfdg kjg45nn | sed 's/[^0-9]//g'

あるいは

echo hgdfjg678gfdg kjg45nn | tr -d -c 0-9
于 2011-09-12T18:18:45.980 に答える
8

これには、オプション-oを指定してgrepを使用できます。

$ echo hgdfjg678gfdg kjg45nn | grep -E -o "[0-9]+"
678
45
于 2011-09-12T18:19:14.727 に答える
3

または使用tr

$ echo hgdfjg678gfdg kjg45nn | tr -d [a-z]
678 45
于 2011-09-12T20:26:04.917 に答える
2

.*sed貪欲です。そして、non-greedyAFAIKのオプションはありません。
(この場合、貪欲でないマッチングのために使用する必要があります[^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
于 2017-05-31T05:23:48.160 に答える