簡體   English   中英

連接sh中字符串的數字

[英]Concatenating digits from a string in sh

假設我有一個像這樣的字符串:

string="1 0 . @ 1 1 ? 2 2 4"

是否可以連接彼此相鄰的數字?

所以這個string就像: 10 . @ 11 ? 224 10 . @ 11 ? 224 10 . @ 11 ? 224

我發現只有基本的東西如何區分整數和其他字符以及如何“連接”它們。 但我不知道如何正確迭代。

num=""
 for char in $string; do
    if [  $char -eq $char 2>/dev/null ] ; then
        num=$num$char

這是一個幾乎純shell的實現 - 將字符串轉換為每行一個字符,並while read循環時使用BashFAQ#1

string="1 0 . @ 1 1 ? 2 2 4"
output=''

# replace spaces with newlines for easier handling
string=$(printf '%s\n' "$string" | tr ' ' '\n')

last_was_number=0
printf '%s\n' "$string" | {
  while read -r char; do
    if [ "$char" -eq "$char" ] 2>/dev/null; then # it's a number
      if [ "$last_was_number" -eq "1" ]; then
        output="$output$char"
        last_was_number=1
        continue
      fi
      last_was_number=1
    else
      last_was_number=0
    fi
    output="$output $char"
  done
  printf '%s\n' "$output"
}

為了補充Charles Duffy有用的,符合POSIX標准的sh解決方案 ,使用更簡潔的perl替代方案:

注意: perl不是POSIX的一部分,但它預裝在大多數現代類Unix平台上。

$ printf '%s\n' "1 0 . @ 1 1 ? 2 2 4" | perl -pe 's/\d( \d)+/$& =~ s| ||gr/eg' 
10 . @ 11 ? 224
  • 外部替換, s/\\d( \\d)+/.../eg ,global( g )查找至少2個相鄰數字( \\d( \\d)+ )的運行,並用結果替換每次運行表達式e )指定為替換字符串(表示為... here)。

  • 內部替換中的表達式$& =~ s| ||gr $& =~ s| ||gr ,其結果用作替換字符串,從每個相鄰數字運行中刪除所有空格:

    • $&表示外部正則表達式匹配的內容 - 相鄰數字的運行。
    • =~將RHS上的s調用應用於LHS,即$& (沒有這個, s調用將隱式應用於整個輸入字符串$_ )。
    • s| ||gr s| ||gr$&的值替換<space>所有( g )實例,並返回( r )結果,有效地刪除所有空格。
      • 請注意| 任意地用作s調用的分隔符,以避免與外部 s調用使用的習慣/分隔符發生沖突。

符合POSIX標准的單線和sed:

string="1 0 . @ 1 1 ? 2 2 4"
printf '%s\n' "$string" | sed -e ':b' -e ' s/\([0-9]\) \([0-9]\)/\1\2/g; tb'

它只是迭代地刪除兩個數字之間的任何空格,直到不再有,導致:

10 . @ 11 ? 224

這是我的解決方案:

string="1 0 . @ 1 1 ? 2 2 4"
array=(${string/// })
arraylength=${#array[@]}
pattern="[0-9]"
i=0

while true; do
    str=""
    start=$i

    if [ $i -eq $arraylength ]; then
        break;
    fi

    for (( j=$start; j<${arraylength}; j++ )) do
       curr=${array[$j]}
       i=$((i + 1))

       if [[ $curr =~ $pattern ]]; then 
           str="$str$curr"
       else
           break
       fi
   done

   echo $str
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM