[英]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.*a
或a.*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.