Regex 如何在标记(*)之间选择多行,不包括最后一行(使用sed)?我该如何选择其余的?
我有一个巨大的.txt文件,格式如下(每个非空行以三重空格开头): 我正在寻找一个代码,它只返回从第一个“*”出现到(但不包括)第二个“*”出现的行 通过浏览多个StackOverflow帖子,我使用Ubuntu(GNU/Linux)获得了以下工作代码: 它为我提供了以下(需要的)输出: 虽然这正是我想要的输出,但你必须同意我的观点,这是一个相当愚蠢的代码,因为我必须使用sed两次。首先,我只有它的第二部分(在“&&”之后),并且会返回正确的东西,除了第一行(*想要的文本)。然后我附加了这段代码的第一部分(在“&&&”之前),所以我也得到了想要的部分的第一行。我尝试过的每一段代码都没有得到更好的结果 仅仅说它是一个非常大的文件是不够的,我将在脚本中递归地执行此操作,因此,如果可能的话,a/q(在找到第一个结果后退出)更可取 完成后,我需要一些将最后一个命令的结果作为输入的东西,这样我就可以得到除先前结果之外的整个文本,例如:Regex 如何在标记(*)之间选择多行,不包括最后一行(使用sed)?我该如何选择其余的?,regex,linux,bash,sed,Regex,Linux,Bash,Sed,我有一个巨大的.txt文件,格式如下(每个非空行以三重空格开头): 我正在寻找一个代码,它只返回从第一个“*”出现到(但不包括)第二个“*”出现的行 通过浏览多个StackOverflow帖子,我使用Ubuntu(GNU/Linux)获得了以下工作代码: 它为我提供了以下(需要的)输出: 虽然这正是我想要的输出,但你必须同意我的观点,这是一个相当愚蠢的代码,因为我必须使用sed两次。首先,我只有它的第二部分(在“&&”之后),并且会返回正确的东西,除了第一行(*想要的文本)。然后我附加了这段代码
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
(...)