首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash拆分子串

Bash拆分子串
EN

Stack Overflow用户
提问于 2011-08-19 10:50:19
回答 4查看 1.7K关注 0票数 2

我接收的数值变量有时是2,另一些是3位数,比如'321‘和'32’。我想在每个数字中加一个点。因此,如果我收到'32',我必须回显'3.2‘,如果我收到'321’,我回应'3.2.1‘。

我就是这样做的:

代码语言:javascript
复制
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

我的问题是:有没有更短的方法来做同样的事情?

更新:更短但仍然冗长:

代码语言:javascript
复制
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版本一样长:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-19 12:43:38

在这方面,我也更喜欢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

或者没有剪裁,它看起来像这样

代码语言:javascript
复制
echo 321 | sed -e 's/\([[:digit:]]\)/.\1/g' -e 's/^\.//'
票数 2
EN

Stack Overflow用户

发布于 2011-08-19 11:04:45

这是一个。这将适用于任何字符串长度。

代码语言:javascript
复制
#!/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
EN

Stack Overflow用户

发布于 2011-08-19 11:10:28

它没那么漂亮,但至少很短:

代码语言:javascript
复制
num=$(echo $S | sed -r "s/([0-9])/\1./g")
echo ${num%%.}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7120518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档