簡體   English   中英

遍歷字符串並在shell中查找某些字符

[英]Loop through string and look for certain characters in shell

可以說我將以下字符串存儲在變量中:

string =“ 1245aaa./ ssasaaa * kjdsaaa”

有沒有辦法以某種方式遍歷該字符串,發現它包含3個“單詞”,可以說用空格隔開,並且最大“ a”的單詞是第二個單詞,總共有4個“ a”在第二個字?

我一直在嘗試谷歌這樣的事情,但沒有運氣。

另一種方法是為至少n個(在您的示例中為4個) a的行進行grepping。
首先,您必須找到需要grep的號碼。
步驟(在評論中要求):
通過用換行符替換( tr ,translation)空格,將字符串中的單詞分成幾行。

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

使用sed 's/old/new/g' ,可以用新字符串g(全局)用舊字符串(模式)替換(替換)舊字符串(模式)。 因此,您可以echo "Have all characters a banned" | sed 's/a//g' echo "Have all characters a banned" | sed 's/a//g' 您要替換字符a以外的所有字符。 所述^[^a]表示not ,在[]的一類的字符。

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

您可以通過排序找到a的最長字符串。 排序后,最后一行將最多。 使用tail -1您可以得到最后一行:

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

現在將結果放入變量。 您可以使用var=$(command)將另一個(一組)unix命令的輸出分配給變量,請注意,不要在=號周圍添加空格( 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"

現在,您可以在單詞列表中以數字a代替該單詞。 如果要使用至少4個a來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}\}" )

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

可以僅在Bash中執行此操作。

鑒於:

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

您可以通過將當前IFS拆分為一個數組,將該字符串拆分為“ words”:

$ 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效率更高,但是您也可以這樣做。

 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM