循环遍历字符串并在shell中查找某些字符

时间:2016-03-04 19:11:43

标签: bash shell

假设我将以下字符串存储在变量中:

string =" 1245aaa。/ ssasaaa * kjdsaaa"

有没有办法以某种方式循环遍历此字符串,并发现它包含3"字"所以说空格分隔,并且最多的单词是" a"是第二个,总共有4个" a"在第二个字?

我一直在努力谷歌这样的东西,但没有运气。

4 个答案:

答案 0 :(得分:1)

另一种方法是使用至少n(在您的示例4中)a' s的线条进行润滑。 首先,你必须找到你需要的数字 步骤(评论中要求):
通过用换行符替换(tr,翻译)空格,将字符串中的单词拆分为行。

echo "${string}" | tr " " "\n"

使用sed 's/old/new/g',您可以使用新字符串g(全局)替换旧字符串(模式)。所以你可以echo "Have all characters a banned" | sed 's/a//g'。您想要替换除字符a之外的所有字符。 ^中的[^a]代表not[]代表一类字符。

echo "${string}" | tr " " "\n" | sed 's/[^a]//g'

您可以通过排序找到最长的字符串。排序后,最后一行将有最多。使用tail -1,您将获得最后一行:

echo "${string}" | tr " " "\n" | sed 's/[^a]//g'|sort | tail -1

现在将结果放入变量中。您可以将另一个(一组)unix命令的输出分配给var=$(command)的变量,请注意,不要在=符号周围添加空格(var = $(xxx)将失败)。

most_a=$(echo "${string}" | tr " " "\n" | sed 's/[^a]//g'|sort | tail -1)

如果要查看变量的内容,请使用$var或更喜欢${var}。使用{},每个人都知道other_chars中的${var}other_chars不是变量名称的一部分。在#${#var},您需要多个字符。在使用echo之前总是使用双引号直到你理解

echo "The word with the highest number of a's has ${#most_a} of those"

现在你可以用一个单词列表中的这个数字来表达这个单词。如果你想要至少4个字符串grep字符串,你将需要.*(任何字符重复0次或更多次),所以grep为a.*a.*a.*aa.*a.*a.*a.*。您可以告诉grep模式(a.*)重复{4}{${#most_a}}次。 现在你需要一些反斜杠来激活(){}字符的特殊含义并开始用单词分割原始字符串:

echo "${string}" | tr " " "\n" | grep "\(a.*\)\{${#most_a}\}"

要打印字符串和数字,请使用

之类的内容
printf "%s %s\n" ${#most_a} $(echo "${string}" | tr " " "\n" | grep "\(a.*\)\{${#most_a}\}" )

答案 1 :(得分:0)

awk可以解决这个问题:

string="1245aaa./ ssasaaa* kjdsaaa"

awk -v k='a' -v RS=' ' '{n = split($0, a, k)-1} 
     n > max{max=n; maxw=$0} END{print maxw, max}' OFS=, <<< "$string"

<强>输出:

ssasaaa*,4

答案 2 :(得分:0)

可以单独在Bash中执行此操作。

鉴于:

$ string="1245aaa./ ssasaaa* kjdsaaa"

您可以通过将当前IFS分解为数组来将该字符串分解为“单词”:

$ words=( $string )

然后遍历每个单词并计算正则表达式匹配:

$ for word in "${words[@]}"
> do
> printf "%i %s\n" $(egrep -o 'a' <<<$word | wc -l) $word 
> done
3 1245aaa./
4 ssasaaa*
3 kjdsaaa

并将结果汇​​总到sort以按匹配计数和head排序以获得最高排名:

for word in "${words[@]}"
do
    printf "%i %s\n" $(egrep -o 'a' <<<$word | wc -l) $word 
done | sort -n -r | head -1
4 ssasaaa*

awk效率更高,但你也可以这样做。

答案 3 :(得分:0)

 string="1245aaa./ ssasaaa* kjdsaaa"

 echo $string | tr ' ' '\n' | while read s
 do  
 echo "`echo $s | tr -dc 'a' | wc -c` $s"
 done | sort -nr

echo $string | xargs -n 1 bash -c 'for s; do echo "`echo $s | tr -dc 'a' | wc -c` $s"; done' bash | sort -nr