Bash-Script(分隔字符串)

时间:2012-12-22 10:38:09

标签: linux bash sorting uniq

我有一个练习,我必须从用户read str获取一个字符串,并打印该字符串的最后一个字符重复的次数。

例如,字符串为:ab2aa2b122 输出将是:4因为2在字符串中重复了4次。

我的问题是将字符串分成单个字符。我希望每个字符都可以通过空格" "\n与其他字符分开,以便使用tr命令和uniq命令。

我必须使用uniqsort命令,为了使用这些命令,我​​必须分割字符,这意味着每个字符必须用空格或\n分隔。

5 个答案:

答案 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}将展开为aP替换为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)

awk one-liner:

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)

使用wccuttr

#/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