如何将 grep 用于 2 条不同的行

Vij*_*rty 19 command-line grep

当两个不同的短语位于两个不同的行上时,如何使用单个grep命令搜索它们?

例如

第 1 行:这是一个甜点。

第2行:柠檬。

我用过这个但没有结果

grep "sweet.*lemon" file_type
Run Code Online (Sandbox Code Playgroud)

Zan*_*nna 25

grep用于两条不同的行,请搜索两种模式

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.
Run Code Online (Sandbox Code Playgroud)

或者使用交替

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.
Run Code Online (Sandbox Code Playgroud)

要在模式后获取下一行,您可以使用上下文选项

$ grep -A1 sweet file_type
This is a sweet
lemon.
Run Code Online (Sandbox Code Playgroud)

但如果你是一个多模式,明确地寻找这是棘手,因为grep认为在行......。你.*会捕捉到“甜”和“柠檬”之间的一切就行了。我们可以在下一行使用-Pusing\n匹配换行符并通过告诉grep文件为空分隔来获得“lemon” -z

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
Run Code Online (Sandbox Code Playgroud)

笔记:

  • -E使用扩展正则表达式(使用|字符进行交替而不需要转义它)
  • -An 在模式后打印额外的行,其中 n 是要打印的尾随行数
  • -P使用 perl 风格的正则表达式(“实验性” grep- 安装pcregrep而不是更好的 perl 正则表达式支持)
  • -z使用空字符作为分隔符(在这种情况下只是假装,但grep会相信我们的话)
  • -o 只打印匹配的部分


mad*_*eon 7

像这样:

grep "sweet\|lemon"
Run Code Online (Sandbox Code Playgroud)

  • @KasiyA 这条线工作正常。`grep` 默认在“标准模式”下工作,其中像 `|`、`+`、`*` 这样的“特殊字符”按字面解释*除非*它们被反斜杠屏蔽。参见例如[这个答案](http://askubuntu.com/questions/293148/grep-operator-does-not-work/298574#298574)。要使用您可能习惯的方式,需要屏蔽“特殊字符”以按字面解释,您需要切换到“扩展模式”(`grep -E`)。也许 madneon 可以详细说明他的答案,例如 OP 尝试*会*匹配什么? (4认同)