Grep 完整名稱,包括單字中的點

Grep 完整名稱,包括單字中的點

kshshell 腳本中,我使用grep命令來取得特定單詞,如下所示。

$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst

$ grep -o "\wdef\w" file.txt
xyzdef
def

我希望輸出是xyzdef.123並且def.jkl

.它沒有在“是否有其他方法可以訪問這個詞”之後獲取值grep,而且我也不知道確切的詞,grep只知道一個模式。我正在研究ksh外殼。

答案1

看起來您只需要字串def及其周圍的所有非空白字元。如果是這樣,您可以使用:

$ grep -Eo '\S*def\S*' file.txt 
xyzdef.123
def.jkl

表示非空白,GNU透過 或標誌\S支援。grep-E-P

答案2

使用grep -oPOSIX 字元類別:

grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt

這本質上就是特登建議,儘管使用稍微不同的語法(並且沒有-E)。這將匹配字串def以及該字串兩側的任何非空白字元(非空白字元是不是空格或製表符的字元)。

或者,

tr '[:blank:]' '\n' <file | grep -F 'def'

這只是將行分成多行,每個空格分隔的單字一行(其中「空白」是製表符或空格字元)。然後,它在生成的行上應用純字串匹配grep -F來查找您感興趣的行。


您的模式 ,\wdef\w對於 GNU grep,如果使用 POSIX 字元類別名稱,則與 相同[[:alnum:]_]def[[:alnum:]_],要求字串def兩側各有一個字母數字字元或底線。點既不是字母數字字元也不是底線。

def如果該模式出現在行的開頭或結尾,也不會符合。

答案3

透過您的嘗試,您無法匹配要返回的整個單字。標誌僅傳回-o定義grep的符合正規表示式部分。也不\w是 POSIX 定義的擴展,grep並且可能僅在支援 PCRE 語法的 GNU 版本中可用。你可以做的

grep -oP '(\w*)def[.](\w*)'

-P標誌開啟 GNU 中的 PCRE 正規表示式模式grep,並且該-o標誌會傳回與定義的正規表示式相符的整個單字。正規表示式被翻譯為匹配零個或多個字母數字字符,後面跟著def一個文字.(括在括號表達式中),後面跟著零個或多個字母數字字符。

下面將使用 POSIX 字元類別來表示字母數字字元。但請記住該標誌-o仍然是 GNU 擴展

grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)' 

相關內容