從文字檔案的行中提取一個元素

從文字檔案的行中提取一個元素

當該行包含與表達式相符的字串時,命令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'

相關內容