次のようなファイルがあります。
helsoidfiejoih
heye heye hey
me is hi
ファイルには任意の数の行または文字を含めることができますが、ポイントはこれが一種のテキストファイルであることです。 grepに渡された最初のパラメータがファイル名で、2番目のパラメータがパターンになるように、grepを使用して操作を実行する必要があります。しかし、grepは貪欲なマッチングを実行するので、私が望む貪欲ではないマッチ(貪欲ではないマッチ)ではなく、行全体にマッチします。今私は次を試しました。
grep -Ec -Po "$2" $1
それは私に矛盾した表現を与えます。ユーザーは任意のパターン(AKA RE)を入力できるため、-Eは必須オプションです。 grepを貪欲にしないようにする方法はありますか? -P オプションを使用すると、grep コマンドが貪欲にならなくなると聞きましたが、試した後は次のようになります。
grep -c -Po "$2" $1
grep表現を貪欲にならないように思えませんか?
編集:人々は私が使用しているモードを表示していないと言いました。たとえば、ユーザーが入力した場合、モードを明確にすることはREになります。
./thisfile.sh h file1.txt
ユーザーが次のように入力すると、file1.txtにhが表示される回数を見つけます。
./thisfile.sh io file1.txt
file1.txt で io の発生回数を探します。これを行う方法はありますか?
答え1
ファイルに部分文字列が表示される回数を数えます。
#!/bin/sh
grep -F -o -e "$1" | wc -l
このスクリプトは次のように使用できます。
$ ./script e <script
2
$ ./script ' -' <script
4
$ ./script hey <file1
3
$ ./script he <file1
4
$ df | ./script %
7
ここでは、スクリプト自体の文字数を計算し、スペースとダッシュe
で構成される部分文字列がスクリプトに表示される回数を計算します。次に、質問で提供されたファイルから複数の部分文字列を数えます。最後の例では、df
システム出力のパーセント記号数を計算します。
入力データは標準入力を介して読み取られ、スクリプトの唯一の引数は、我々が探して計算したい部分文字列です。
スクリプトは単一のgrep
+wc
パイプで構成されています。非標準(ただし一般的に実装されている) -o
オプションを使用して、重複しない一致項目のリストを別の行に返します。その後、これらの行を計算するために使用されますwc -l
。
usegrep
を呼び出すと、-F
パターンは正規表現ではなく文字列として解釈されます。これにより、*
エスケープすることなくファイル内の発生回数を数えることができます*
(まだ必要です)。引用する*
シェルがそれをワイルドカードパターンとして使用するのを防ぐために)。-F
パターンを正規表現として使用する場合は省略してください。
このオプションは、これがモードであることを-e
示すために使用されます。使用しない場合、同様のパターンがオプションとして解釈されます。grep
$1
-e
--version
grep
答え2
一部のバージョンgrep
(GNUなど)では、Perl準拠のREを提供できます(参照:ポリメラーゼ連鎖反応)、これは標準のPOSIX正規表現よりはるかに柔軟です。