假设我有一个变量
line="This is where we select from a table."
现在我想知道 select 在句子中出现了多少次。
grep -ci "select" $line
我尝试过,但没有成功。我也尝试过
grep -ci "select" "$line"
它仍然不起作用。我收到以下错误。
grep: This is where we select from a table.: No such file or directory
答案1
已grep
阅读其标准输入。就这样,使用管道...
$ echo "$line" | grep select
... 或者这里的字符串...
$ grep select <<< "$line"
另外,您可能想在 grep 之前用换行符替换空格:
$ echo "$line" | tr ' ' '\n' | grep select
...或者您可以要求grep
仅打印匹配项:
$ echo "$line" | grep -o select
这将允许您在匹配时删除该行的其余部分。
编辑:哎呀,读得太快了,谢谢马可。为了计算发生次数,只需将其中任何一个通过管道传输到wc(1)
;)
之后进行的另一次编辑伊兹卡塔的评论,$line
使用时引用echo
。
答案2
test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
grep
这么简单的事根本不需要打电话。
或者作为一个函数:
occur() while case "$1" in (*"$2"*) set -- \
"${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
(*) return "$((${4:-0}<${3:-1}))";;esac
do : "${_occur:+$((_occur=$4))}";done
它需要 2 或 3 个参数。提供超过这个数量将会扭曲其结果。您可以像这样使用它:
_occur=0; occur ... . 2 && echo "count: $_occur"
.
...如果in...
至少出现 2 次,则打印它的出现次数。像这样:
count: 3
如果$_occur
为空或者unset
当它被调用时,则它根本不会影响任何 shell 变量,return
如果"$2"
出现的次数"$1"
少于 1 ,则为 1 "$3"
。或者,如果仅使用两个参数调用,则return
仅当"$2"
不在 中时它才会为 1 "$1"
。否则返回 0。
因此,以最简单的形式,您可以执行以下操作:
occur '' . && echo yay || echo shite
...打印...
shite
...但...
occur . . && echo yay || echo shite
...将打印...
yay
$2
您也可以稍微不同地编写它,并省略(*"$2"*)
和语句中的引号"${1#*"$2"}"
。如果这样做,那么您可以使用 shell glob 进行匹配,例如sh[io]te
匹配测试。
答案3
我只是使用 sed 为我分解句子,然后比较循环中的每一行,因为这对我来说似乎是最简单的方法(无意冒犯这里的任何人,而且我也不是专家,所以人们可能有一个原因不要这样做,不确定)
string="a a a a a asd gsam en"
count=$(echo $string | sed 's/ /\n/g' | grep -w 'a' | wc -l)
echo $count
当我运行它时
mark@gamerblock:~$ string="a a a a a asd gsam en"
mark@gamerblock:~$ count=$(echo $string | sed 's/ /\n/g' | grep -w 'a' | wc -l)
mark@gamerblock:~$ echo $count
5
作为带有输入参数的脚本
#!/bin/bash
echo "Enter your string"
read string
echo "Enter what you want substring counted"
read substring
count=$(echo $string | sed 's/ /\n/g' | grep $substring | wc -l)
echo $count
当跑的时候
mark@gamerblock:~$ ./substring.sh
Enter your string
peter piper picked a pack of pickled peppers. a pack of pickled peppers peter piper did pick.
Enter what you want substring counted
peter
2
mark@gamerblock:~$ ./substring.sh
Enter your string
peter piper picked a pack of pickled peppers. a pack of pickled peppers peter piper did pick.
Enter what you want substring counted
p
0
如果您不需要精确匹配,请从 grep 中删除 -w 参数
mark@gamerblock:~$ ./substring.sh
Enter your string
peter piper picked a pack of pickled peppers. a pack of pickled peppers peter piper did pick.
Enter what you want substring counted
p
12
mark@gamerblock:~$