[英]How do i select multiple lines between markers (*) excluding the last one (using sed)? And how do I select all the rest?
我有一个巨大的.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。 首先,我只有它的第二部分(在“ &&”之后),并且将返回除第一行(*所需文本)之外的其他内容。 然后,我在代码的第一部分(“ &&”之前)附加了,因此我也得到了所需部分的第一行。 我尝试过的所有其他代码都没有给我带来更好的结果。
永远不要说这是一个很大的文件,我将在脚本中递归执行此操作,因此,如果可能的话,最好使用/ q(在找到第一个结果后退出)。
完成此操作后,我需要将最后一条命令的结果作为输入的内容,因此除先前的结果外,我可以获得确切的整个文本,例如:
unwanted text
unwanted text
*wanted text 2
content
content
*wanted text 3
content
content
(...)
因此,总而言之,我的两个问题是:
希望我足够清楚。 请问我是否缺少任何细节。 非常感谢您的关注!
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
(...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.