簡體   English   中英

使用Regex和linux命令(grep或egrep?)查找特定的字符串

[英]using Regex and linux commands(grep or egrep?) to find specific strings

注意 :我不確定我的正則表達式是否正確,因為我在學校的教科書並未解釋/教這種形式的正則表達式,而只是解釋了數學形式(例如DFA / NFA)

我將不勝感激任何建議或提示

題:

(a)在文本中找到所有以“ a”開頭並以“ e”結尾的三個字母單詞;

(b)查找文本中所有以“ m”開頭並以“ r”結尾的單詞;

我的方法:

a) ^[a][a-zA-Z][e]$ (如何區分3個字母的單詞和所有單詞?)

b) ^[m][a-zA-Z][r]$

我也想在Linux中使用這些正則表達式,因此以下命令可以工作嗎?:

grep '^[a][a-zA-Z][e]$' 'usr/dir/.../text.txt'

還是我應該以這種方式使用egrep:

find . -text "*.txt" -print0 | xargs -0 egrep '^[a][a-zA-Z][e]$'

您可以為兩個匹配項使用grep -w和正則表達式的替代項:

grep -w 'a[a-zA-Z]e\|m[a-zA-Z]*r' file.txt

您可以使用邊界\\b來匹配單詞的開頭和結尾:

a)查找所有以“ a”開頭並以“ e”結尾的三個字母詞的出現;

grep -o '\ba[a-zA-Z]e\b'

圖案字邊界匹配,則隨后的a ,單個字符和以下e和字邊界。

b)查找文本中所有以“ m”開頭和以“ r”結尾的單詞出現;

grep -o '\bm[a-zA-Z]*r\b'

該模式匹配一​​個單詞邊界,一個m零個或多個字符(用*表示),一個r和一個單詞邊界。


此外,我使用了-o選項,它在自己的行上輸出每個匹配項,而不是輸出包含匹配項的整個輸入行。


順便說一句,多虧了-w選項-僅匹配整個單詞-您甚至可以將上述模式簡化為:

一種)

grep -wo 'a[a-zA-Z]e'

和b)

grep -wo 'm[a-zA-Z]*r'

感謝@anubhava!


您要求提供egrep egrep不能幫助簡化或優化模式。 grep絕對沒問題。

首先, egrep是擴展grep ,它與使用選項-E調用grep相同。 其次,在很多情況下,您不需要使用findxargs ,因為存在-r選項,它將在指定路徑內的文件中遞歸搜索。

您的正則表達式適合grep支持的基本(非擴展)正則表達式語言,因此不需要egrep

我將簡化為

grep -r '^a[a-zA-Z]e$' /usr/share/dict/

和這個

grep -r '^m[a-zA-Z]*r$' /usr/share/dict/

在您的示例中,您將只用三個字符匹配全行,匹配您期望的字母。

'^'表示行的開頭

“ $”表示行尾

為了只提取三個字母詞,您必須在某些空格上進行匹配。 例如grep'a [aZ] e''usr / dir /.../ text.txt'

但是,這將丟失行開頭或結尾的三個字母單詞的所有實例

這是使用egrep和grep匹配空格/行首的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM