从文本文件的行中提取一个元素

从文本文件的行中提取一个元素

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

如果您不介意使用其他工具,那么一个非常简单的解决方案就是使用后过滤输出greptr删除所有出现的字符*

grep -x '\*\*[^*]*\*\*' | tr -d '*'

我还建议您使用-xGNU grep 的标志(如上所示)来仅匹配整行,以免意外捕获**word**同一行上其他文本包围的内容。这也可能加快模式匹配过程,因为它现在可以尽早丢弃许多潜在匹配。

sed选择

您还可以利用 sed 的p标志将匹配、替换和打印作为单个命令:

sed -nre 's/^\*\*([^*]*)\*\*$/\1/p'

相关内容