bash grep换行符

Mar*_*kus 11 bash grep

[ 编辑插入:可能重复同一张海报的早期问题?]

嗨,我需要从文件中提取:

first
second
third
Run Code Online (Sandbox Code Playgroud)

使用grep命令,以下行:

second
third
Run Code Online (Sandbox Code Playgroud)

grep命令应该如何?

not*_*oop 20

而不是grep,您可以使用pcregrep哪个支持多行模式

pcregrep -M 'second\nthird' file
Run Code Online (Sandbox Code Playgroud)

-M 允许模式匹配多行.

  • 您可能希望使用`\ s +`代替`\n`,具体取决于文件中的行结尾(有些可能是`\ r \n`) (4认同)

And*_*w Y 8

您的问题摘要"bash grep newline",意味着您希望匹配second\nthird字符序列 - 即包含换行符的内容.

由于grep在"行"上工作,而这两行是不同的行,你将无法以这种方式匹配它.

所以,我将它分成几个任务:

  1. 你匹配包含"second"的行并输出匹配的行和后续行:

    grep -A 1 "second" testfile
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您将每个其他换行符转换为保证不会在输入中出现的序列.我认为最简单的方法是使用perl:

    perl -npe '$x=1-$x; s/\n/##UnUsedSequence##/ if $x;'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 你在这些行上做一个grep,这次搜索字符串##UnUsedSequence##third:

    grep "##UnUsedSequence##third"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 你将未使用的序列解包回到换行符中,sed可能是最简单的:

    sed -e 's/##UnUsedSequence##/\n'
    
    Run Code Online (Sandbox Code Playgroud)

所以生成的管道命令可以执行您想要的操作:

grep -A 1 "second" testfile | perl -npe '$x=1-$x; s/\n/##UnUsedSequence##/ if $x;' | grep "##UnUsedSequence##third" | sed -e 's/##UnUsedSequence##/\n/'
Run Code Online (Sandbox Code Playgroud)

到目前为止不是最优雅,但应该工作.我很想知道更好的方法 - 应该有一些.


Rob*_*lls 1

线?还是线路?

尝试

grep -E -e '(second|third)' filename
Run Code Online (Sandbox Code Playgroud)

编辑: grep 是面向行的。您将必须使用 Perl、sed 或 awk 来执行跨行模式匹配。

BTW -E 告诉 grep 正则表达式是扩展的 RE。