bash grep换行符

时间:2009-08-04 15:38:51

标签: bash grep

[编辑插入:同一张海报的earlier question可能重复?]

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

first
second
third

使用grep命令,以下行:

second
third

grep命令应该如何?

11 个答案:

答案 0 :(得分:20)

您可以使用支持多行模式

grep,而不是pcregrep
pcregrep -M 'second\nthird' file

-M允许模式匹配多行。

答案 1 :(得分:8)

你的问题摘要“bash grep newline”暗示你想要匹配second\nthird字符序列 - 即包含换行符的内容。

由于grep在“lines”上工作,而这两行是不同的行,你将无法以这种方式匹配。

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

  1. 您匹配包含“second”的行并输出匹配的行和后续行:

    grep -A 1 "second" testfile
    
  2. 将所有其他换行符转换为保证不会在输入中出现的序列。我认为最简单的方法是使用perl:

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

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

    sed -e 's/##UnUsedSequence##/\n'
    
  5. 因此,生成管道命令可以执行您想要的操作:

    grep -A 1 "second" testfile | perl -npe '$x=1-$x; s/\n/##UnUsedSequence##/ if $x;' | grep "##UnUsedSequence##third" | sed -e 's/##UnUsedSequence##/\n/'
    

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

答案 2 :(得分:3)

我不认为 grep 是这样做的。

如果您只想从任何文件中删除第一行(以概括您的问题),我会使用 sed

sed '1d' INPUT_FILE_NAME

这会将文件的内容发送到标准输出,并删除第一行。

然后,您可以将标准输出重定向到另一个文件以捕获结果。

sed '1d' INPUT_FILE_NAME > OUTPUT_FILE_NAME

应该这样做。

如果你必须使用 grep 而只是不想在其上显示 first 的行,那么试试这个:

grep -v first INPUT_FILE_NAME 

通过 -v 开关,您告诉 grep 向您显示所有您传递的表达式。实际上显示的是除了第一个的行之外的所有内容。

但是,缺点是其中包含多个 first 的文件也不会显示其他行,也可能不是您期望的行为。

要将结果分流到新文件中,请尝试以下操作:

grep -v first INPUT_FILE_NAME > OUTPUT_FILE_NAME

希望这有帮助。

答案 3 :(得分:2)

我真的不明白你想要匹配什么。我不会使用grep,而是使用以下之一:

tail -2 file         # to get last two lines
head -n +2 file      # to get all but first line
sed -e '2,3p;d' file # to get lines from second to third

(不确定它是多么标准,它肯定适用于GNU工具)

答案 4 :(得分:1)

行?还是行?

尝试

grep -E -e '(second|third)' filename

编辑: grep是面向行的。你将不得不使用Perl,sed或awk来跨行执行模式匹配。

BTW -E告诉grep正则表达式已扩展为RE。

答案 5 :(得分:1)

所以你只是不希望该行包含“first”? -v反转grep结果。

$ echo -e "first\nsecond\nthird\n" | grep -v first
second
third

答案 6 :(得分:1)

grep -A1“第二个”| grep -B1“第三”效果很好,如果你有多个匹配,它甚至可以摆脱原来的 - 匹配分隔符

答案 7 :(得分:0)

grep -E '(second|third)' /path/to/file
egrep -w 'second|third' /path/to/file

答案 8 :(得分:0)

你可以使用

$ grep -1 third filename

这将打印一个匹配前后的字符串和一个字符串。因为“第三个”在最后一个字符串中,所以你得到最后两个字符串。

答案 9 :(得分:0)

我喜欢notnoop's answer,但建立在AndrewY's answer上(对于那些没有pcregrep的人来说更好,但是太复杂了),你可以这样做:

RESULT=`grep -A1 -s -m1 '^\s*second\s*$' file | grep -s -B1 -m1 '^\s*third\s*$'`

答案 10 :(得分:0)

grep -v '^first' filename

-v标志反转匹配。