grep
当行中包含与表达式匹配的字符串时,命令将打印该行,这对于搜索指定内容并不方便。
例如,我有以下格式的词汇文件
**word**
1. Definition:
2. Usage
3. Others
我想检索所有单词以在文件中创建单词列表
grep '\*\*[^*]*\*\*'
返回大部分内容。
如何使用grep
来仅捕获word
?
答案1
就像这样,使用perl正则表达式(-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'