[英]How to use awk to find a char in a string in bash
我有一個名為sign
的char
變量和一個給定的字符串sub
。 我需要找出這個sign
在sub
中出現了多少次並且不能使用grep
。
例如:
sign = c
sub = mechanic cup cat
echo "$sub" | awk <code i am asking for> | wc -l
而 output 應該是4
因為c
出現了 4 次。 <>里面應該是什么?
sign=c
sub='mechanic cup cat'
echo "$sub" |
awk -v sign="$sign" -F '' '{for (i=1;i<=NF;i++){if ($i==sign) cnt++}} END{print cnt}'
編輯:
評論中要求的更改:
sign
的長度是否為 1(否=
存在)。 如果為真,將sign
和sub
更改為小寫以忽略大小寫。${sign:0:1}
僅將第一個字符傳遞給awk
。sign=c
sub='mechanic Cup cat'
if [ "${#sign}" -eq 1 ]; then
sign=${sign,,}
sub=${sub,,}
fi
echo "$sub" |
awk -v sign="${sign:0:1}" -F '' '{for (i=1;i<=NF;i++){if ($i==sign) cnt++}} END{print cnt}'
Quasimodo 的評論和 Freddy 的小寫示例的組合:
$ sign=c
$ sub='mechanic Cup cat'
如果${sign}
是單個字符,則為tr
+ wc
解決方案。
計算${sign}
在${sub}
中出現的次數,忽略大小寫:
$ tr -cd [${sign,,}] <<< ${sub,,} | wc -c
4
在哪里:
${sign,,}
& {sub,,}
- 全部轉換為小寫tr -cd [...]
- 查找括號內列出的所有字符( []
),- -d
表示刪除/刪除所述字符,而-c
表示取補碼(即,刪除括號中的所有字符) ,所以-cp [${sign,,]
表示要刪除除${sign}
中存儲的字符之外的所有字符<<<....
- 這里是字符串(允許將變量/字符串作為參數傳遞給tr
wc -c
計算字符數注意:這僅在${sign}
包含單個字符時有效。
sed
解決方案無論${sign}
中的字符數如何都應該有效。
$ sub='mechanic Cup cat'
首先,我們在每次出現${sign,,}
之前嵌入一個換行符:
$ sign=c
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,}
me
chani
c
cup
cat
$ sign=cup
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,}
mechanic
cup cat
在哪里:
\(${sign,,}\)
- 找到匹配${sign}
的模式(全部小寫)並分配給 position 1
\n\1
- 在 position 1 中的模式之前,在 stream 中放置一個換行符 ( \n
) 在這一點上,我們只想要以${sign,,}
開頭的行,這是tail +2
發揮作用的地方(即顯示第 2 到 n 行):
$ sign=c
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2
chani
c
cup
cat
$ sign=cup
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2
cup cat
現在我們 pipe 到wc -l
以獲取行數(即,計算${sign}
在${sub}
中出現的次數 - 忽略大小寫):
$ sign=c
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2 | wc -l
4
$ sign=cup
$ sed "s/\(${sign,,}\)/\n\1/g" <<< ${sub,,} | tail +2 | wc -l
1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.