![Grep 完整名稱,包括單字中的點](https://rvso.com/image/154442/Grep%20%E5%AE%8C%E6%95%B4%E5%90%8D%E7%A8%B1%EF%BC%8C%E5%8C%85%E6%8B%AC%E5%96%AE%E5%AD%97%E4%B8%AD%E7%9A%84%E9%BB%9E.png)
在ksh
shell 腳本中,我使用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 -o
POSIX 字元類別:
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:]]*\)'