[ 编辑插入:可能重复同一张海报的早期问题?]
嗨,我需要从文件中提取:
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 允许模式匹配多行.
您的问题摘要"bash grep newline",意味着您希望匹配second\nthird字符序列 - 即包含换行符的内容.
由于grep在"行"上工作,而这两行是不同的行,你将无法以这种方式匹配它.
所以,我将它分成几个任务:
你匹配包含"second"的行并输出匹配的行和后续行:
grep -A 1 "second" testfile
Run Code Online (Sandbox Code Playgroud)您将每个其他换行符转换为保证不会在输入中出现的序列.我认为最简单的方法是使用perl:
perl -npe '$x=1-$x; s/\n/##UnUsedSequence##/ if $x;'
Run Code Online (Sandbox Code Playgroud)你在这些行上做一个grep,这次搜索字符串##UnUsedSequence##third:
grep "##UnUsedSequence##third"
Run Code Online (Sandbox Code Playgroud)你将未使用的序列解包回到换行符中,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)
到目前为止不是最优雅,但应该工作.我很想知道更好的方法 - 应该有一些.
线?还是线路?
尝试
grep -E -e '(second|third)' filename
Run Code Online (Sandbox Code Playgroud)
编辑: grep 是面向行的。您将必须使用 Perl、sed 或 awk 来执行跨行模式匹配。
BTW -E 告诉 grep 正则表达式是扩展的 RE。
| 归档时间: |
|
| 查看次数: |
36439 次 |
| 最近记录: |