我試圖在 Linux 終端中將 Regex 與 grep 命令一起使用,以便過濾文本檔案中以大寫字母開頭并以正整數結尾的行。有沒有辦法修改我的命令,以便它在一行中通過一次呼叫 grep 而不是兩次呼叫來完成所有這些操作?我正在為 linux 和微軟商店 ubuntu 使用 windows 子系統。
文本檔案:
C line 1
c line 2
B line 3
d line 4
E line five
我已經開始作業的命令:
grep ^[A-Z] cap*| grep [0-9]$ cap*
輸出
C line 1
B line 3
這有效,但我覺得正則運算式陳述句可以以某種方式組合,但是
grep ^[A-Z][0-9]$
不會產生與上述命令相同的結果。
uj5u.com熱心網友回復:
你需要使用
grep '^[A-Z].*[0-9]$'
grep '^[[:upper:]].*[0-9]$'
請參閱在線演示。正則運算式匹配:
^- 字串的開始[A-Z]/[[:upper:]]- 一個大寫字母.*- 任何零個或多個字符([^0-9]*匹配零個或多個非數字字符)[0-9]- 一個數字。$- 字串的結尾。
另外,如果要確保-字串末尾的數字之前沒有,則需要使用否定括號運算式,例如
grep -E '^[[:upper:]](.*[^-0-9])?[1-9][0-9]*$'
在這里,POSIX ERE regx(由于-E選項)匹配
^[[:upper:]]- 開頭的大寫字母,然后(.*[^-0-9])?- 任何文本的可選出現,然后是除數字以外的任何字符和-[1-9]- 一個非零數字[0-9]*- 零個或多個數字$- 字串的結尾。
uj5u.com熱心網友回復:
當您使用管道時,您希望第二個grep處理標準輸入,而不是您最初從中獲取的檔案。
grep ^[A-Z] cap*| grep [0-9]$
但是,如果要排除負數,則需要擴展第二個正則運算式。無論如何,更好的解決方案可能是切換到 Awk:
awk '/^[A-Z]/ && /[0-9]$/ && $NF > 0' cap*
輸出格式與grep;略有不同。如果要包含匹配檔案的名稱,則必須單獨指定:
awk '/^[A-Z]/ && /[0-9]$/ && $NF > 0 { print FILENAME ":" $0 }' cap*
正則運算式^[A-Z][0-9]$正好匹配兩個字符,第一個必須是字母,第二個必須是數字。如果你想允許它們之間的任意文本,那將是^[A-Z].*[0-9]$(為了不那么隨意,使用比 更具體的東西.*,比如(.*[^-0-9])?你需要grep -E括號和問號的地方,或者在每個這些之前的反斜杠您使用 POSIX 開箱即用的 BRE 正則運算式方言grep)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/390156.html
