Grep

將多個 grep 與正則表達式結合起來

  • October 27, 2021

我有這個文件:

10 replies
Big Horse
123sdf562
replies
1354654
Fat Cat
2 replies
White Horse
Big Cat
Little Dog
5 replies
725vgfvjgh123
Black Horse
Brown Cow
8798jgjh

我想提取包含單詞 horse 的行,單詞以數字開頭的回復和數字包圍的字母。所以我想要的輸出必須是:

10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

此程式碼grep '[0-9] replies\|[0-9][a-z]\|Horse' file返回

Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse
8798jgjh

8798jgjh不應出現在輸出中,因為jgjh它沒有被數字包圍。

grep '[0-9] replies\|[0-9][a-z][0-9]\|Horse' file不起作用。那麼,如何才能獲得正確的輸出呢?

您可以將其與 GNU 一起使用grep

$ grep 'Horse\|^[0-9]\+ replies$\|^[0-9]\+[^0-9]\+[0-9]\+$' file
10 replies
Big Horse
123sdf562
2 replies
White Horse
5 replies
725vgfvjgh123
Black Horse

您的命令的問題是您沒有量化[a-z],因此它只查找一個字元。

你可以用這個grep。在多個地方使用量詞(在 BRE 中)的想法\{1,\}是匹配一起使用的組中的至少一個字元。一個攜帶式版本將是做

grep '[0-9]\{1,\}[[:space:]]\{1,\}replies\|Horse\|[0-9]\{1,\}[a-z]\{1,\}[0-9]\{1,\}' file

grep支持 ERE 的版本上,例如 GNU grep,不需要表達式上的額外轉義字元

grep -E '[0-9]{1,}[[:space:]]+replies|Horse|[0-9]{1,}[a-z]{1,}[0-9]{1,}' file

您可以將字元類組替換為與區域無關的組[0-9],例如and 。[a-z]``[[:digit:]]``[[:lower:]]

正則表達式 - 回顧

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