Выдаліць усе сімвалы, якія ня лічба з радка

Я спрабую зрабіць невялікую функцыю, якая выдаляе ўсе знакі, якія не з'яўляюцца лічбамі.

123a45a ---> will become ---> 12345

Я прыдумаў:

temp=$word | grep -o [[:digit:]]
echo $temp

Але замест таго, каб 12345 Я атрымліваю 1 2 3 4 5 . Як пазбавіцца ад прасторы?

2

7 адказы

Чысты Баш:

word=123a45a 
number=${word//[^0-9]}
8
дададзена
проста біць мяне да яго :-)
дададзена аўтар iruvar, крыніца

Вось чысты раствор Баш

var='123a45a'
echo ${var//[^0-9]/}
12345
6
дададзена

гэта тое, што вы шукаеце?

kent$  echo "123a45a"|sed 's/[^0-9]//g'
12345

grep & tr

echo "123a45a"|grep -o '[0-9]'|tr -d '\n'
12345
4
дададзена
@Kent: Глядзіце мой адказ для лепшага тр падыход. :-)
дададзена аўтар ruakh, крыніца
@NadavPeled дзіўнага патрабаванні ... хатняе заданне? Ёсць некаторыя іншыя адказы пашырэння параметраў Баша, яны дазволеныя?
дададзена аўтар Kent, крыніца
@NadavPeled ОК, тр дапускаецца. то гэта нармальна. Я дадаў у адказ. але іншыя ўжо размешчаны падобнае.
дададзена аўтар Kent, крыніца
Так, вялікі дзякуй:] павінны былі даць зялёнае знак на першы, хто адправіў гэта, робіць працу на самай справе вельмі добра.
дададзена аўтар Nadav Peled, крыніца
Ды: \ хатняга задання .. частка невялікага праекта .. У гэтым раздзеле мы толькі дазволена выкарыстоўваць Grep \ тр
дададзена аўтар Nadav Peled, крыніца
мы не маем права выкарыстоўваць СЭД: \ толькі Grep ..
дададзена аўтар Nadav Peled, крыніца

Я б рэкамендаваў выкарыстоўваць <�патч в/код> або PERL замест таго, каб:

temp="$(sed -e 's/[^0-9]//g' <<< "$word")"
temp="$(perl -pe 's/\D//g' <<< "$word")"

Edited to add: If you really need to use grep, then this is the only way I can think of:

temp="$( grep -o '[0-9]' <<< "$word" \
         | while IFS= read -r ; do echo -n "$REPLY" ; done
       )"

, , , але там, напэўна, лепш. (Ён выкарыстоўвае Grep -o , як ваша рашэнне, а затым бяжыць па лініях, што выхады і паўторныя выхады іх без парываў радкоў).


Edited again to add: Now that you've mentioned that you use can use tr instead, this is much easier:

temp="$(tr -cd 0-9 <<< "$word")"
3
дададзена
@downvoter: Сыход растлумачыць, чаму?
дададзена аўтар ruakh, крыніца
+1 для -c
дададзена аўтар Kent, крыніца
+1 для тр . чыстай і простай. І выпадак выкарыстання на гэтае пытанне з'яўляецца тое, што тр для.
дададзена аўтар anishsane, крыніца

тр таксама будзе працаваць:

echo "123a45a" | tr -cd '[:digit:]'

# output: 12345
2
дададзена
@anishsane: Праўда і не прымаць якой-небудзь крэдыт ад rukah, але гэта быў першы тр на аснове адказу, але дзякуючы вам неабходна сапраўды наладзіць дадаткова: P
дададзена аўтар anubhava, крыніца
@anishsane: Добры пытанне, я адрэдагаваў мой адказ, каб выправіць гэта.
дададзена аўтар anubhava, крыніца
«Выдаліць усе знакі, якія не з'яўляюцца лічбы» рэха «123 @ # 45abc!» | TR -d '[: альфа:]'
дададзена аўтар anishsane, крыніца
Зараз гэта суб-адказ адказу ruakh, але дуля (-1 -> +1) :-)
дададзена аўтар anishsane, крыніца

Што аб выкарыстанні патч у ?

$ echo "123a45a" | sed -r 's/[^0-9]//g'
12345

Як я прачытаў вы толькі дазволена выкарыстоўваць Grep і тр , гэта можа зрабіць трук:

$ echo "123a45a" | grep -o [[:digit:]] | tr -d '\n'
12345

У вашым выпадку,

temp=$(echo $word | grep -o [[:digit:]] | tr -d '\n')
2
дададзена
Гэта Бескарыснае Выкарыстанне Echo . Выкарыстоўвайце Тэмп = $ (Grep -o [[: лічбы:]] <<< "$ слова" | тр -d '\ п') замест гэтага.
дададзена аўтар dogbane, крыніца
Глядзіце мой адказ на лепшы спосаб з тр . :-)
дададзена аўтар ruakh, крыніца
СЭД з'яўляецца празмернасцю для гэтага ...
дададзена аўтар anishsane, крыніца
Дзякуй, апошні робіць працу вялікі =]
дададзена аўтар Nadav Peled, крыніца

Grep returns the result on different lines:

$ echo -e "$temp"
1
2
3
4
5

Такім чынам, вы не можаце выдаліць гэтыя прабелы падчас фільтрацыі, але вы можаце пасля гэтага, так як $ Тэмп можа пераўтварыць сябе, як гэта:

temp=`echo $temp | tr -d ' '`
$ echo "$temp"
12345
0
дададзена