Grep

如何grep選定的字元串由-分隔

  • February 15, 2022

我是 grep 的新手,我有一個包列表,我只需要顯示某些結果。

以下是軟體包列表:

apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-dbg/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-doc/oldoldstable,oldoldstable 2.4.25-3+deb9u12 all
apache2-ssl-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-custom/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-pristine/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]

我一直在嘗試使用正則表達式,但我確定有問題:

cat list | grep 'apache2-(bin|data|utils)'

這是我的預期輸出:

apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]

我的命令有什麼問題/缺少什麼?

|使用 BRE(基本正則表達式)模式匹配時需要轉義括號和字元,這是 中的預設值grep,因此:

grep '^apache2-\?\(bin\|data\|utils\|\)/'

-E或使用開關啟用 ERE(擴展正則表達式)模式匹配:

grep -E '^apache2-?(bin|data|utils|)/'

筆記:

  • 您不需要 feed grepwith,cat因為它像許多其他工具一樣直接從文件中讀取。
  • 我添加了行首^以從行首開始匹配。
  • -?在 ERE 和-\?BRE 中添加了僅與連字元-零或一次匹配的;另請注意,使用的\?不是有效的標準 BRE(即使它至少在 GNU 和其他一些工具中工作)。BRE 等價\?\{0,1\}.
  • 我在其中添加了一個空的最後一個|匹配項(...|...|...|),它將匹配apache2僅行之類的情況(但如果您的輸入中有任何內容,它也會匹配apache2-,如果您不想匹配,請grep -E '^apache2(-(bin|data|utils)|)/'改用);
  • 使用\|也不是標準的 BRE,也沒有等效的。最好只使用 ERE 給定的替代方案。

另請參閱為什麼我的正則表達式在 X 中有效,但在 Y 中無效?

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