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

时间:2019-03-22 20:19:33

标签: bash sed posix

我有多个用于生成不同工件的文件(markdown)。对于工件之一,我需要解析以#AND开头的行以及模式之间的行(::: 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大师都很方便吗? 提前致谢!!

1 个答案:

答案 0 :(得分:2)

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

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

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

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