當該行包含與表達式相符的字串時,命令grep
將列印該行,這不方便搜尋指定內容。
例如,我有帶有格式的詞彙文件
**word**
1. Definition:
2. Usage
3. Others
我想檢索所有單字以在文件中建立單字列表
grep '\*\*[^*]*\*\*'
返回大部分內容。
如何使用grep
僅捕獲word
?
答案1
像這樣的單字,使用珀爾正規表示式(-P
):
grep -oP '^\s*\*\*\K[^*]+(?=\*\*)' file
輸出 :
word
像這樣的單字:
grep -oP '^\s*\d+\.\s*\K\w+' file
輸出 :
Definition
Usage
Others
答案2
有幾種工具可用於提取單詞,這是在 sed 中實現的版本:
sed '/^\*\*/!d' <your_file
此命令將匹配文件中以 開頭的每一行**
並列印它。其他行將從輸出中刪除。如果您還想刪除星星,您可以將命令擴展為:
sed '/^\*\*/!d;s/\*//g' <your_file
此外,此命令將*
在列印之前刪除該行中的所有字元。
答案3
與awk
方式:
awk -F'*\\*' 'NF>2{print $2}' infile
範例測試輸入:
*wrd*
*woooord
**WRD
WORD**
woooooooooood*
**word**
輸出:
word
答案4
如果您不介意使用其他工具,一個非常簡單的解決方案是對grep
輸出進行後過濾以tr
刪除所有出現的字元*
:
grep -x '\*\*[^*]*\*\*' | tr -d '*'
我還建議您使用-x
上面的 GNU grep 標誌來僅匹配整行,以免意外捕獲**word**
同一行上被其他文字包圍的情況。這也可以加速模式匹配過程,因為它現在可以儘早丟棄許多潛在的匹配。
sed
選擇
您也可以利用 sed 的p
標誌將匹配、替換和列印作為單一命令:
sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'