尝试从单个命令解析多个模式(使用 sed)

trying to parse multiple patterns from single command (using sed)

我有多个文件(markdown)用于生成不同的工件。对于其中一个工件,我需要解析以 # 开头的行以及模式之间的行 (::: notes -> :::)。

示例文件

# Blah 

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. 

- one 
- two 
- three 

<!-- 
::: notes 

- one is yadda yadda 
- two is yadda yadda yadda 
- three is wrong 

:::
--> 

## derp derp 

Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

# woo hoo! 

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 

<!-- 
::: notes 

Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

::: 
--> 

我可以使用 sed 为我找到所有 #

sed -n '/#/p' FILENAME.md

产生输出:

# Blah 
## derp derp 
# woo hoo! 

而且我可以使用 sed 正确地找到并吐出笔记

sed -n '/::: notes/, /:::/p' FILENAME.md 

产生输出:

::: notes 

- one is yadda yadda 
- two is yadda yadda yadda 
- three is wrong 

:::
::: notes

Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

::: 

但我真正需要的是以正确的顺序输出(与文件中出现的顺序相同),例如:

# Blah
::: notes 

- one is yadda yadda 
- two is yadda yadda yadda 
- three is wrong 

:::
## derp derp 
# woo hoo!
::: notes 

Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

::: 

任何 sed 大师的手? 提前致谢!!

可以通过这种方式指定多个搜索模式:

sed -e 'command' -e 'command' filename

因此您的解决方案如下所示:

sed -n -e '/::: notes/, /:::/p' -e '/#/p' FILENAME.md