Bash сплит подстрока - PullRequest
       13

Bash сплит подстрока

2 голосов
/ 19 августа 2011

Я получаю числовые переменные иногда с 2, а иногда с 3 цифрами, например, «321» и «32». И я хочу поставить точку среди каждого из чисел. Поэтому, если я получаю «32», я получаю эхо «3.2», а если я получаю «321», я эхо «3.2.1».

Вот что я сделал:

S='321'
SL="${#S}" #string lentgh

n1=`echo $S | cut -c 1-1`
n2=`echo $S | cut -c 2-2`

if [ "$SL" -eq 2 ]; then
    echo $n1.$n2
elif  [ "$SL" -eq 3 ]; then
    n3=`echo $S | cut -c 3-3`
    echo $n1.$n2.$n3
else
    die 'Works only with 2 or 3 digits'
fi

Мой вопрос: есть ли более короткий способ сделать то же самое?


UPDATE: Короче, но все еще многословно:

SL="${#1}" #string lentgh
S=$1
if [ "$1" -eq 3 ]; then
    $n3=".${S:2:1}"
fi
if  [ "$SL" -lt 2 ] && [ "$SL" -gt 3 ]; then
    die 'Works only with 2 or 3 digits'
fi

echo "${S:0:1}.${S:1:1}$n3"

ОБНОВЛЕНИЕ 1:

Если я включу блок if, версия sed + regex будет такой же, как и версия для чистого bash:

SL="${#1}" #string lentgh
S=$1
N=$(echo $S | sed -r "s/([0-9])/\1./g")
echo ${N%%.}
if  [ "$SL" -lt 2 ] && [ "$SL" -gt 3 ]; then
    die 'Works only with 2 or 3 digits'
fi

Или, используя одну строку sed + regex с двумя выражениями:

SL="${#1}" #string lentgh
echo $1 | sed -e 's/\([[:digit:]]\)/.\1/g' -e 's/^\.//'
if  [ "$SL" -lt 2 ] && [ "$SL" -gt 3 ]; then
    die 'Works only with 2 or 3 digits'
fi

Спасибо.

Ответы [ 4 ]

2 голосов
/ 19 августа 2011

Я предпочитаю также Sed для этого:

echo 321 | sed -e 's/\([[:digit:]]\)/.\1/g' | cut -b2- -> 3.2.1

echo 32 | sed -e 's/\([[:digit:]]\)/.\1/g' | cut -b2- -> 3,2

Или без разреза это выглядит так

echo 321 | sed -e 's/\([[:digit:]]\)/.\1/g' -e 's/^\.//'
2 голосов
/ 19 августа 2011

Вот один из них. Это будет работать для любой длины строки.

#!/bin/bash

#s is the string
#fs is the final string

echo "Enter string"
read s

n="${#s}"
fs=""

i=0
for ((i=0; i<n; i++))
  do
   fs="$fs.${s:i:1}"
done

#find the length of the final string and
#remove the leading '.' 

n="${#fs}"
fs="${fs:1}"

echo "$fs"
2 голосов
/ 19 августа 2011

Это не так красиво, но, по крайней мере, коротко:

num=$(echo $S | sed -r "s/([0-9])/\1./g")
echo ${num%%.}
1 голос
/ 19 августа 2011
S='321'
perl -e "print join '.', split //, shift" "$S"
...