我有一個文件,類似:
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
。
對grep
use 的呼叫-F
使模式被解釋為字串而不是正規表示式。這使得可以計算文件中出現的次數*
,而不必轉義*
(您仍然需要引用來*
阻止 shell 將其用作通配模式)。-F
如果您想使用該模式作為正規表示式,請省略。
該-e
選項用於表明grep
這$1
就是模式。如果-e
不使用,類似的模式--version
將被解釋為 的選項grep
。
答案2
某些版本grep
(例如 GNU 的)允許您提供 Perl 相容的 RE(查看聚合酶鍊式反應),這些比標準 POSIX 正規表示式靈活得多。