Text-Processing
列印最多(包括)一行中第 n 個出現的模式
假設我在一個文件中有多行類似於下面的行。
Turbo is a cat. cats are good. cats are not dog. Coco is a black cat. cats are furry. cats are not dog.
現在,如果想要
grep
全部^.*cat
但要特別提到要擷取直到單詞的第一次(或第 n 次)出現cat
。期望的輸出:
Turbo is a cat Coco is a black cat *blah is a so and so cat*
我
grep
該怎麼辦?PS:我很想
grep
只使用(或其其他變體)得到答案。PS:我不想grep
^.*cat.
然後做任何操作來刪除 “。” . 我想要一個通用的答案。
使用POSIX grep,您只能選擇列印整行,或者根本不列印行內容。如果要變換線條,則需要使用其他工具,例如 sed 或 awk。列印直到第一次出現
cat
:sed -n 's/cat.*/cat/' awk 'sub(/cat.*/,"")'
列印到第N次出現更複雜。
sed -n 's/cat/&\ /3; T; P' awk 'gsub(/cat/,"&\n") >= 3 {split($0, a, "\n"); printf "%s%s%s\n", a[1], a[2], a[3]}'
使用GNU grep,您可以使用該
-o
選項僅列印該行的匹配部分。使用該-P
選項來啟動 Perl 語法,以便可以使用非貪婪量詞。grep -P -o '^(.*?cat){1}'
將大括號中的數字替換為要列印的最後一次出現的數字n 。
cat
雖然可以使用擴展正則表達式 (
-E
) 來表達相同的內容,但這需要一個複雜的正則表達式,其大小與要計數的部分的大小成指數關係(cat
此處)。