この問題はシェルスクリプトで解決する必要があります。以下の文字列の発生回数を数えていますが、abc
私が望む答えは3です。
echo abcsdabcsdabc | grep -o abc
abc
abc
abc
-o
オプションがないと仮定すると、どのように処理するgrep
必要がありますか?
ベストアンサー1
文字列は次の区切りフィールドで構成されていると思いますabc
。
$ echo abcsdabcsdabc | awk -F 'abc' '{ print (length > 0 ? NF - 1 : 0) }'
3
区切り文字の発生回数は、abc
1 から区切り文字が区切られたフィールドの数を引いたものです。
$ echo abcsdabcsdabc | awk '{ n=0; while (sub("abc", "xxx")) n++; print n }'
3
abc
その後、その行の部分文字列が置き換えられ、xxx
完了した回数が計算され、その数が出力されます。n=0
入力行が1行だけの場合は必要ありません。
gsub()
の関数はawk
置換回数を返すので、上記の内容は次のように単純化できます。
$ echo abcsdabcsdabc | awk '{ print gsub("abc", "xxx") }'
3
では、bash
このプログラムで行ったのと同じことができます。awk
sub()
string=abcsdabcsdabc
n=0
while [[ $string == *abc* ]]; do
n=$(( n+1 ))
string=${string/abc/xxx} # replace first occurrence of "abc" with "xxx"
done
printf '%d\n' "$n"
while
これは、上記の2番目のプログラムと同様に、inが見つからなくなるまでループを使用してin値の部分文字列を置き換えます。abc
$string
xxx
abc
$string
awk