在 grep 命令匹配到的字符串后提取文件中的所有内容

7

昨天出现了一个情况,有人需要我将文件的尾部分离出来,这个尾部是指特定字符串(假设为“FOO”)之后的所有内容。由于我需要立即处理此事,所以我选择了我知道可以运行的选项,而没有考虑正确或最佳的方法,我选择了以下方法:

grep -n FOO FILE.TXT | cut -f1 -d":" | xargs -I{} tail -n +{} FILE.TXT > NEWFILE.TXT

我对这个问题感到困扰的是在单一值时使用xargs。我认为我可以通过谷歌搜索来解决这个问题,但我很想看看SO社区中的人们为这种情况想出了什么样的解决方案。


如何在bash中忽略匹配之前的所有行?(原文链接:https://dev59.com/R2025IYBdhLWcg3wkGx7) - glenn jackman
3个回答

15
sed -n '/re/,$p' file

这是我最先想到的。


2
选择正确的工具来完成任务。sed 是你需要的工具。Mod +1。 - David W.
1
(我猜re指的是“正则表达式”)(即:sed -n'/search_pattern/,$p'文件)请返回翻译后的文本内容。 - dajon
如果您想使用shell变量替换re,该怎么办?例如,foo="my pattern"; sed -n '/$foo/,$p' file无法工作,因为'会阻止shell扩展,而sed -n "/$foo/,$p" file也无法工作,因为shell尝试扩展$p,导致错误sed: -e expression #1, char 27: unexpected ',' - user5359531

11

您考虑过使用grep的“--after-context”参数吗?

像这样使用,如果设置足够大,就可以查找文件结束:

grep --after-context=999999 -n FOO FILE.TXT > NEWFILE.TXT

你需要给那个函数传递一个数字参数吗?这正是我最初考虑的功能。 - geoffjentry
啊,你是最初发布后添加的吗?我没有想到要用一个非常大的数字。另外,999999在这种情况下可能不够用,但你的观点仍然正确。 - geoffjentry
是的,抱歉Geoff,你可能碰巧在我正在编辑示例的过程中找到了我。 - Phil Street
8
如果999999不足够,那么 --after-context=$(wc -l < FILE.TXT) 将会被使用。 - glenn jackman

1
与geekosaur上面的答案类似,但此选项是排除匹配行,而不是包含它们:
sed '1,/regex/d' myfile

在尝试上述选项后,在这里找到了这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接