簡體   English   中英

如何使用 awk 在 bash 中的字符串中查找字符

[英]How to use awk to find a char in a string in bash

我有一個名為signchar變量和一個給定的字符串sub 我需要找出這個signsub中出現了多少次並且不能使用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}'

編輯:

評論中要求的更改:

  1. 測試sign的長度是否為 1(否=存在)。 如果為真,將signsub更改為小寫以忽略大小寫。
  2. 使用${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.

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