次のようなファイルを取得しました:
helsoidfiejoih
heye heye hey
me is hi
ファイルには任意の数の行や文字を含めることができますが、ポイントは、何らかのテキスト ファイルであることです。次に、grep を使用して何らかの操作を実行する必要があります。そのため、grep に渡される最初のパラメーターはファイル名で、2 番目のパラメーターはパターンです。ただし、grep は貪欲な一致を行うため、私が望んでいる非貪欲な一致 (非貪欲な一致) ではなく、行全体が一致します。次に、次の操作を試しました。
grep -Ec -Po "$2" $1
矛盾した表現が返されます。また、ユーザーは任意のパターン (別名 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
。
の呼び出しは、パターンを正規表現ではなく文字列として解釈するためにgrep
使用します。これにより、例えば、ファイル内での出現-F
回数を、エスケープすることなく数えることができます(*
*
引用*
ただし、シェルがそれをグロブパターンとして使用するのを止めるために、 を省略します。パターン-F
を正規表現として使用する場合は省略します。
オプションは、 がパターンであることを-e
伝えるために使用されます。が使用されない場合、 のようなパターンはのオプションとして解釈されます。grep
$1
-e
--version
grep
答え2
いくつかのバージョンgrep
(例えばGNU)では、Perl互換の正規表現を与えることができます(ペクレ)、これらは標準の POSIX 正規表現よりもはるかに柔軟です。