繁体   English   中英

如何选择标记之间的多行(*),但最后一行除外(使用sed)? 而我该如何选择其余的呢?

[英]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

   (...)

因此,总而言之,我的两个问题是:

  • 有没有一种方法可以使用sed单线获得如上所述的第一期望输出,而无需调用sed两次(最好在找到摘录后退出,这样它就不会搜索所有大文件)? 我敢肯定,有一个更优雅的解决方案。
  • 如何获得“除上一个问题的结果以外的所有文本”作为输出(如“反向”输出?)? 我没有软件要求,我只需要它,这样我就可以一次又一次地运行先前的操作并“不断更新”输入,并根据特定条件处理第一个命令的每个输出。

希望我足够清楚。 请问我是否缺少任何细节。 非常感谢您的关注!

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM