grep --before-context 5 在比赛前显示5行。
我想展示比赛前的一切。
这样做grep --before-context 99999999是可行的,但不是很...专业。
如何显示匹配的所有文件?
grep --before-context 5 在比赛前显示5行。
我想展示比赛前的一切。
这样做grep --before-context 99999999是可行的,但不是很...专业。
如何显示匹配的所有文件?
Answers:
塞德对此更好。
做就是了:
sed '/PATTERN/q' FILE
它的工作方式如下:
对于每一行,我们查看它是否匹配/PATTERN:
这是最有效的解决方案,因为它一看到PATTERN就退出。如果没有q,sed将继续读取文件的其余部分,并且不执行任何操作。对于大文件,可以有所作为。
这个技巧也可以用来模仿head:
sed 10q FILE
sed '/PATTERN/Q' FILE将跳过匹配的行。Q是GNU扩展,因此它不适用于任何sed。
sed 可以取代grep的大部分功能。
sed -n '1,/<pattern>/ p' <file>
这意味着从第一行开始打印,直到匹配图案为止。
几个范围示例
sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
打印并包括以下匹配项:
awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename
最多打印但不包括匹配项:
awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
Q酷但GNU特有的afaik,sed -n '/pattern/!p;//q'会更便携。
!让p适用于线不匹配pattern,但随后//q混淆了我...
//意思是“先前的正则表达式”(我以为意思是“匹配空字符串”)。我认为相同的解决方案的一个较短的版本是:sed -n '/pattern/q;p?
以下纯GNU grep方法效率不高。
使用三个s 在文件栏中搜索字符串“ foo ” 的第一个实例之前的所有内容:grep
grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar
匹配“ foo ” 的最后一个实例:
grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar
注意:有关最后一项的详细信息,请grep参见:正则表达式(grep),需要进行多行搜索。
sed代码似乎值得其回答,或者可以将其添加到其他代码中。回复7个grepS:因为没有grep答案......(加,得到的答案有助于表明为什么不呢?)
在上面添加到Mikel的答案中...
要打印所有线路可达,但不包括,第一行FILE包含PATTERN,尝试:
sed '/.*PATTERN.*/{s///;q;}' FILE这将匹配包含模式的整行,将其替换为空白行,然后退出而不处理文件的其余部分。
后记:
我想避免在末尾打印额外的换行符(不涉及其他工具)的最简单/最清晰的方法是再次运行sed并删除新的最后一行:
sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'
...并且由于我们现在无论如何都删除该行,因此我们以前的工作是多余的,我们可以简化为:
sed '/PATTERN/q' FILE | sed '$d'
sed调用来做到这一点。
tcsh和bash别名中都使用了它,因此我需要确保有一个相对简洁的单线解决方案,可在标准和GNU中使用sed(出于可移植性);您的贡献很可能满足的所有要求。正如有人谁使用sed 非常罕见,我最重要的要求是什么,当我不想轻易从现在编辑或重新目的,多年来,我可以很快的了解。
对于只选择记住日常工作中的基本工具,并愿意接受不太优雅,效率较低的解决方案的人们:
head -n $(grep -n pattern filename | cut -d: -f1) filename
如果此命令用于脚本,那么我将寻找更优雅(且可能高效)的解决方案。如果这是一次性命令或一次性脚本,那么我不在乎。
您也可以使用以下之一
tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac
要么
tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac
要么
tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac
第一个选项与OP所建议的非常相似,只是它通过计算文件中的行数来确保ti在上下文之前显示足够的行数
第二个选项搜索第一个匹配项的行号(您也可以通过更改内部的“ head”来更改行号),然后在该编号上使用head
最后一个选项将所有新行替换为匹配项,然后将两个相邻的匹配项替换为新行。此输出是两次匹配之间每个文本块的一行。之后,它使用“ head”选择第一行(将文本块更改为第一个匹配项),然后将每个匹配项重新转换为新行。仅当文件采用以下格式时,此选项才有效
pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern
texttexttext
texttexttexttexttexttexttexttexttext
依此类推
sed底部的命令有点过时。