Regex 如何在标记(*)之间选择多行,不包括最后一行(使用sed)?我该如何选择其余的?

Regex 如何在标记(*)之间选择多行,不包括最后一行(使用sed)?我该如何选择其余的?,regex,linux,bash,sed,Regex,Linux,Bash,Sed,我有一个巨大的.txt文件,格式如下(每个非空行以三重空格开头): 我正在寻找一个代码,它只返回从第一个“*”出现到(但不包括)第二个“*”出现的行 通过浏览多个StackOverflow帖子,我使用Ubuntu(GNU/Linux)获得了以下工作代码: 它为我提供了以下(需要的)输出: 虽然这正是我想要的输出,但你必须同意我的观点,这是一个相当愚蠢的代码,因为我必须使用sed两次。首先,我只有它的第二部分(在“&&”之后),并且会返回正确的东西,除了第一行(*想要的文本)。然后我附加了这段代码

我有一个巨大的.txt文件,格式如下(每个非空行以三重空格开头):

我正在寻找一个代码,它只返回从第一个“*”出现到(但不包括)第二个“*”出现的行

通过浏览多个StackOverflow帖子,我使用Ubuntu(GNU/Linux)获得了以下工作代码:

它为我提供了以下(需要的)输出:

虽然这正是我想要的输出,但你必须同意我的观点,这是一个相当愚蠢的代码,因为我必须使用sed两次。首先,我只有它的第二部分(在“&&”之后),并且会返回正确的东西,除了第一行(*想要的文本)。然后我附加了这段代码的第一部分(在“&&&”之前),所以我也得到了想要的部分的第一行。我尝试过的每一段代码都没有得到更好的结果

仅仅说它是一个非常大的文件是不够的,我将在脚本中递归地执行此操作,因此,如果可能的话,a/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

这当然是个骗局
sed-ne'/^\*想要文本$/,/^$/{p;}'foo.txt
通常您可以使用
修复格式,但无法使其正常工作。嘿,这非常有效!非常感谢你!这是一个非常优雅的解决方案。我注意到“反斜杠”字符不会出现在我的计算机上,因此它不会显示您必须写“反斜杠”而不是简单的“反斜杠”,因为sed会将星号识别为特殊字符。
*wanted text
abc
def
\n (representing a wanted blank line)
   unwanted text
   unwanted text

   *wanted text 2
   content
   content

   *wanted text 3
   content
   content

   (...)
$ 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

   (...)