変数があるとしましょう。
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"
また、grepingの前にスペースを改行にすることもできます。
$ 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
呼び出されるとシェル変数にはまったく影響を与えず、1回未満のreturn
場合は1です。または、2つの引数のみを使用して呼び出すと、にない場合にのみ1になります。それ以外の場合は0を返します。"$2"
"$1"
"$3"
return
"$2"
"$1"
したがって、最も簡単な形式で次のことができます。
occur '' . && echo yay || echo shite
...印刷...
shite
...しかし...
occur . . && echo yay || echo shite
...印刷されます...
yay
$2
少し異なる方法で作成し、(*"$2"*)
ステートメントから引用符を省略することもできます"${1#*"$2"}"
。これにより、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:~$