Text-Processing

列印最多(包括)一行中第 n 個出現的模式

  • April 13, 2016

假設我在一個文件中有多行類似於下面的行。

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此處)。

引用自:https://unix.stackexchange.com/questions/276025