我有一个练习,我必须从用户read str
获取一个字符串,并打印该字符串的最后一个字符重复的次数。
例如,字符串为:ab2aa2b122
输出将是:4
因为2
在字符串中重复了4次。
我的问题是将字符串分成单个字符。我希望每个字符都可以通过空格" "
或\n
与其他字符分开,以便使用tr
命令和uniq
命令。
我必须使用uniq
和sort
命令,为了使用这些命令,我必须分割字符,这意味着每个字符必须用空格或\n
分隔。
答案 0 :(得分:1)
100%纯bash溶液:
read -r -p "Enter your string: " a
l=${a:(-1)}
b=${a//[^$l]/}
n=${#b}
echo "Last character is \`$l' and is repeated $n times in the string \`$a'"
没有循环,没有外部过程,没有!
作为一个单行(显示它真的很短,可能是最短的!):
echo "ab2aa2b122"|{ read -r a;b=${a//[^${a: -1}]/};echo ${#b};}
第一个版本的解释(第二个版本完全相同,但适合代码 - 高尔夫比赛)。
a
中。l=${a:(-1)}
会将a
的最后一个字符存储在l
中。更一般地,${a:i:j}
扩展为a
的子字符串,从索引 i 开始,长度为 j 。当 i = - 1时,它会扩展为最后一个字符。${a//P/R}
将展开为a
,P
替换为R
。此处R
为空,P
为[^$l]
,因此匹配与l
不同的所有字符。底线:${a//[^$l]/}
扩展为a
,其中删除与上一个不同的所有字符。因此,我们只留下2222
。${#b}
扩展为b
的大小(此处为其长度)。所以我们完成了!答案 1 :(得分:0)
不确定您是否可以在练习中使用sed
,但使用sed
可以这样做:
bash-3.1$ PPP=`echo ab2aa2b122 | sed 's/\(.\)/\1 /g'`
bash-3.1$ echo $PPP
a b 2 a a 2 b 1 2 2
答案 2 :(得分:0)
kent$ echo "ab2aa2b122"|awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++)a[$i]++;print "last char "$NF" : "a[$NF]" times";}'
last char 2 : 4 times
如果您只想获得数字“4”:
kent$ echo "ab2aa2b122"|awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++)a[$i]++;print a[$NF]}'
4
答案 3 :(得分:0)
来自OP:
我的问题是将字符串分成单个字符。我希望每个字符都可以通过空格(&#34;&#34;)或\ n(下一行)与其他字符分开 - 以便使用tr命令和uniq命令。
从作为评论留下的评论到我的其他答案:
我已经学会了基本的命令,如cat,cut,tr,sort,uniq,for和while循环,if,cp,wc,输入输出(&gt; |),地球样式的升级和扩展常规表达式(egrep ..)但我允许在当前的练习中使用egrep和扩展的reg表达式以及globe样式。谢谢!
To&#34; divide&#34;你的字符串使用grep
:
使用可怕的echo
- 管道和子壳:
echo "$string" | grep -o '.'
使用here字符串:
grep -o '.' <<< "$string"
希望这有帮助!
答案 4 :(得分:0)
仅使用wc
,cut
和tr
:
#/bin/bash
input="ab2aa2b122"
length=$(wc -c <<< $input)
last=$(cut -c $((length-1)) <<< $input)
tr -dc $last <<< $input | wc -c
wc -c
计算字符串中的字符数。
cut -c $len-1
获取字符串
tr -dc $last
删除所有不是最后(即2)的字符,留下字符串2222
,然后再使用wc -c
来计算长度
./script.sh
4