как захватить только цифры в массиве, используя оператор if в bash

#arrays #bash #if-statement

#массивы #bash #if-statement

Вопрос:

 len=${#newarray[*]}

for ((i=0;i<${len};i  )); do

    if [[ "${newarray[$i]}" =~ ^[[:digit:]] $ ]]; then 

        echo "${newarray[$i]}"     
    fi
  
  

это мой код, мне нужно получить только цифры из списка массива и их количество. но есть проблема, которая показывает только алфавитные значения.

данный getdata.txtcontains —

    cat  
   dog
   1234
   pl345
   567ab
   12234
     
  

Комментарии:

1. Ваш if/else обратный. Вы должны выполнить echo в if и continue в else , поскольку if соответствует числовым значениям.

2. Почему вы повторяете newfolders вместо value ?

3. Вы можете просто использовать len in for ((i=0;i<len;i )); do (переменные автоматически расширяются внутри (( ... )) )

4. да, я изменил if-else, но он также захватывает pl345 @Barmar

5. спасибо, я сделал это таким образом, моя проблема с if else stement @DavidC.Rankin

Ответ №1:

Имея:

 value=(cat dog 1234 pl345 567ab 12234)
  

Вы могли бы напечатать «только цифры»:

 $ printf "%sn" "${value[@]}" | grep -o "[0-9]*"
1234
345
567
12234
  

или, может быть, вам нужны «только строки, содержащие только числа»:

 $ printf "%sn" "${value[@]}" | grep -x "[0-9]*"
1234
12234
  

или, может быть, вам нужны «только строки с числом»:

 $ printf "%sn" "${value[@]}" | grep "[0-9]"
1234
pl345
567ab
12234
  

Ответ №2:

Ваш if/else обратный.

 value=(cat dog 1234 pl345 567ab 12234)
len=${#value[*]}
    
for ((i=0;i<${len};i  )); do
    if [[ "${value[$i]}" =~ ^[[:digit:]] $ ]]; then 
         echo "${value[$i]}"   
    fi
done
  

Это выводит:

 1234
12234
  

Ответ №3:

Существует способ сделать это без регулярных выражений при bash использовании shopt :

 # enable extended glob
shopt -s extglob

value=(cat dog 1234 pl345 567ab 12234)

# lop through array and print only it contains 1  digits
for v in "${value[@]}"; do [[ $v ==  ([0-9]) ]] amp;amp; echo "$v"; done
  
 1234
12234
  

Ответ №4:

Вероятно, вам следует использовать два вложенных цикла:

  1. перебор всех элементов массива
  2. выполните итерацию по всем символам в элементе, проверьте, является ли символ цифрой

(2), вероятно, было бы проще с grep, но поскольку мы говорим о реализации bash, я придумал это:

 #!/bin/bash

a=(cat dog 1234 pl345 567ab 12234) # input array

for s in "${a[@]}"; do # iterate over all elements of our array
        res=''
        for ((i=0;i<${#s};i  )); do # iterate over all chars of element $s
                c="${s:$i:1}" # $c is now char at $i position inside $s
                case "$c" in
                        [0-9]) res="${res}${c}" # append digit to res
                esac
        done
        [ -n "$res" ] amp;amp; echo "$res" # if $s contains at least 1 digit, print it
                                     # you may add $res to another array here if needed

done
  

Ответ №5:

Просто

 tr -dc '0-9n' <getdata.txt
  

Ответ №6:

Вы можете использовать:

 $ cat getdata.txt |grep -P '^[0-9] $'