我有一个非常大的文本文件,包含多个部分。这些部分包括部分标题。我想提取节标题并用 grep 或 sed 打印它们。该文件如下所示:
=========
Section Header
=========
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Mauris pellentesque pulvinar pellentesque habitant. A iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Blandit aliquam etiam erat velit scelerisque in dictum non. Cras tincidunt lobortis feugiat vivamus at. Elit ut aliquam purus sit amet luctus venenatis lectus. Et magnis dis parturient montes nascetur ridiculus mus mauris. Rutrum tellus pellentesque eu tincidunt tortor aliquam nulla facilisi. Urna id volutpat lacus laoreet non curabitur gravida arcu. Imperdiet proin fermentum leo vel orci porta. Vel risus commodo viverra maecenas accumsan. Diam ut venenatis tellus in. Ultrices dui sapien eget mi. Vivamus arcu felis bibendum ut. Nam aliquam sem et tortor consequat id porta nibh venenatis.
==========
Another Section
==========
Dictum at tempor commodo ullamcorper. Adipiscing elit pellentesque habitant morbi tristique senectus et. Malesuada pellentesque elit eget gravida cum sociis natoque. Venenatis tellus in metus vulputate eu. Eget aliquet nibh praesent tristique magna sit amet purus. Arcu non odio euismod lacinia at quis risus sed. Cursus eget nunc scelerisque viverra. Habitant morbi tristique senectus et netus et malesuada. Dolor sed viverra ipsum nunc. Magna eget est lorem ipsum dolor sit amet consectetur. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Nulla malesuada pellentesque elit eget gravida cum. Rhoncus est pellentesque elit ullamcorper dignissim cras.
标头中等号的数量可能会有所不同。我想在单独的行上打印每个节标题。最好用后视来删除等号线。
答案1
也试试
$ sed -n '/=\+/ {n;p;n;}' file
Section Header
Another Section
在一个或多个行上=
,获取下一行,打印它,然后获取下一行(被遗忘)。
答案2
无论您的标头是单行还是多行,都可以在每个 Unix 机器上的任何 shell 中稳健地使用任何 awk:
$ awk '/^=+$/{f=!f; next} f' file
Section Header
Another Section
使用正则表达式,就像^={9,}$
您有其他包含所有等号但不指示标题部分的行一样。
答案3
命令 insed
可以通过行号、正则表达式或可能由两者的组合组成的范围来寻址。
该范围与标记/^==*$/,/^==*$/
包围的标题行相匹配====
。正则表达式^==*$
可以理解为“一行包含一个或多个=
字符,但没有其他内容”。这意味着以下内容将打印所有标题,包括标题标记行:
sed -n '/^==*$/,/^==*$/ p' file
为了避免打印标题标记行,仅调用p
不是标题标记之一的行:
sed -n '/^==*$/,/^==*$/ { // !p; }' file
空正则表达式重用最近使用的正则表达式,并且确保在表达式使用时!
调用p
不是匹配。
鉴于您问题中的文字,这会导致
Section Header
Another Section
这也适用于多行标题:
$ cat file
====
Title: Hello world
Author: Me
====
Text goes here
====
That was it
The end
====
$ sed -n '/^==*$/,/^==*$/ { // !p; }' file
Title: Hello world
Author: Me
That was it
The end