我有一个巨大的.txt文件格式如下(每个非空白行以三个空格开头):
unwanted text
unwanted text
*wanted text
abc
def
*wanted text 2
content
content
*wanted text 3
content
content
(...)
我正在寻找一个代码,它只返回第一个“*”发生的行,直到(但不包括)第二个“*”发生。
浏览多个StackOverflow帖子,我已经设法使用Ubuntu(GNU / Linux)获得以下工作代码:
sed -n -e '/^ \*/{p;q}' bigfile.txt && sed -e '1,/ \*/d' -e '/ \*/,$d' bigfile.txt
它给了我以下(按需)输出:
*wanted text
abc
def
\n (representing a wanted blank line)
虽然这正是我想要的输出,你必须同意我,这是一个有点愚蠢的代码,因为我必须使用sed两次。首先,我只有它的第二部分(在“&&”之后)并且除了第一行(*想要的文本)之外将返回正确的东西。然后我附加了第一部分代码(在“&&”之前),所以我也得到了想要部分的第一行。我试过的每一段代码都没有给我带来更好的结果。
这是永远不够的,它是一个非常大的文件,我将在脚本中递归地执行此操作,因此,如果可能的话,a / q(在找到第一个结果后退出)是可取的。
完成此操作后,我需要将最后一个命令的结果作为输入,因此我可以获得完整的文本,除了先前的结果,如下:
unwanted text
unwanted text
*wanted text 2
content
content
*wanted text 3
content
content
(...)
总而言之,我的两个问题是:
希望我足够清楚。请问我是否缺少任何细节。 非常感谢你的关注!
答案 0 :(得分:0)
awk
救援!
$ awk '$1~/^*/{if(f) exit; f=1} f' file
*wanted text
abc
def
<-- here is the empty line formatter eats
第二部分
$ awk '$1~/^*/{f++} !f||f>1' file
unwanted text
unwanted text
*wanted text 2
content
content
*wanted text 3
content
content
(...)