我有以下文件:
------
Introduction
----------
Optio eum enim ut. Et quia molestias eos. Doloribus laborum quia quae. Magnam cupiditate quis consectetur.
-----
Chapter1: Foo
-----
Odit beatae eius voluptas temporibus sint quia. Eos et tempora similique laboriosam optio consequatur quibusdam. Fugit suscipit cupiditate ea perspiciatis rem labore cum eos.
-----
Chapter bar
-----
Et consequatur quia quia et architecto et sunt. Perferendis qui deserunt qui est illo est sapiente ipsam. Fugiat vel amet magni in quam. Eligendi totam cum sapiente harum blanditiis minima
具有以下约束:
- 标题符号
-
至少出现 5 个字符或更多。 -
和标题之间可能有任意(但有限)数量的空行。
预期的输出是:
Introduction
Chapter1: Foo
Chapter bar
我知道这可以使用来完成,awk
但请不要建议这样做。我希望看到一个纯 GNU sed 解决方案。
这是我到目前为止所尝试的:
sed -n ':a; /-\+/{n; /^$/!{p; b a}}' input.txt
但是该命令似乎不起作用。
这将打印包含至少一个字母或数字字符的行,只要它们位于标题内。
我提出这个解决方案:
'/\-\{5,\}/,/\-\{5,\}/p'
选择-
(至少 5 个)之间的部分。'/\-\+\|^$/d'
删除空行或以 . 开头的行-
。虽然您确实可以在
sed
其他工具中执行此操作会让事情变得更容易(IMO)1也可以工作。例如,在awk
:为了摆脱空行,你可以这样做:
或者:
这里的想法是将变量设置
a
为1
当前是否为 0 或未设置 (!a
) 并且当前行至少匹配 5-
。如果我们在设置为 1时0
找到另一行有 5的行,我们将其设置回。然后我们打印所有设置的行(这就是 final 所做的:如果评估为非 0 ,它将打印)。-
a
a
a
a
这是以更易于理解的方式编写的相同内容:
1卡西莫多的回答更简单!
您可以使用:
或者,您也可以使用
sed -z
:没有
-E
:注意:虽然这适用于您的示例,但如果
-
出现在文本中的某处可能会出现问题。但我认为,你可以详细说明这一点。