如何使 Grep 非貪婪

如何使 Grep 非貪婪

我有一個文件,類似:

helsoidfiejoih
heye heye hey 
me is hi

該文件可以包含任意數量的行或字符,重點是它是某種文字文件。現在我需要使用 grep 來做一些操作,以便傳遞給 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

它將查找 h 在 file1.txt 中出現的次數 如果使用者輸入

./thisfile.sh io file1.txt

它將尋找 io 在 file1.txt 中出現的次數。有沒有辦法做到這一點?

答案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

grepuse 的呼叫-F使模式被解釋為字串而不是正規表示式。這使得可以計算文件中出現的次數*,而不必轉義*(您仍然需要引用*阻止 shell 將其用作通配模式)。-F如果您想使用該模式作為正規表示式,請省略。

-e選項用於表明grep$1就是模式。如果-e不使用,類似的模式--version將被解釋為 的選項grep

答案2

某些版本grep(例如 GNU 的)允許您提供 Perl 相容的 RE(查看聚合酶鍊式反應),這些比標準 POSIX 正規表示式靈活得多。

相關內容