[编辑插入:同一张海报的earlier question可能重复?]
嗨,我需要从文件中提取:
first
second
third
使用grep命令,以下行:
second
third
grep命令应该如何?
答案 0 :(得分:20)
您可以使用支持多行模式
的grep
,而不是pcregrep
pcregrep -M 'second\nthird' file
-M
允许模式匹配多行。
答案 1 :(得分:8)
你的问题摘要“bash grep newline”暗示你想要匹配second\nthird
字符序列 - 即包含换行符的内容。
由于grep在“lines”上工作,而这两行是不同的行,你将无法以这种方式匹配。
所以,我将它分成几个任务:
您匹配包含“second”的行并输出匹配的行和后续行:
grep -A 1 "second" testfile
将所有其他换行符转换为保证不会在输入中出现的序列。我认为最简单的方法是使用perl:
perl -npe '$x=1-$x; s/\n/##UnUsedSequence##/ if $x;'
你在这些行上做了一个grep,这次搜索字符串##UnUsedSequence##third
:
grep "##UnUsedSequence##third"
你将未使用的序列解包回到换行符中,sed可能是最简单的:
sed -e 's/##UnUsedSequence##/\n'
因此,生成管道命令可以执行您想要的操作:
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标志反转匹配。