Bash Sed/Awk-在模式x和y之间拉线

Bash Sed/Awk-在模式x和y之间拉线,bash,sed,awk,Bash,Sed,Awk,我有一些大型CSV文件,我想在其中提取包含模式“X”的X行和包含模式“Y”的Y行之间的所有数据 例如: other_data Header data data data Footer other_data 我希望能够将页眉->页脚之间(包括页眉->页脚)的所有内容通过管道传输到新文件 谢谢 使用awk非常简单: awk '/Header/ { show=1 } show; /Footer/ { show=0 }' 基本上在名为show的变量中保持状态。当我们击中页眉时,我们打开它,页脚时,我

我有一些大型CSV文件,我想在其中提取包含模式“X”的X行和包含模式“Y”的Y行之间的所有数据

例如:

other_data
Header
data
data
data
Footer
other_data
我希望能够将页眉->页脚之间(包括页眉->页脚)的所有内容通过管道传输到新文件


谢谢

使用
awk
非常简单:

awk '/Header/ { show=1 } show; /Footer/ { show=0 }'

基本上在名为
show
的变量中保持状态。当我们击中页眉时,我们打开它,页脚时,我们关闭它。启用时,
show
规则执行打印记录的默认操作。

在sed中非常简单:

sed -n '/Header/,/Footer/p'


使用awk的另一种方式是:

awk '/Header/,/Footer/' file
Header
data
data
data
Footer
只需重定向输出以保存在新文件中:

awk '/Header/,/Footer/' file > newfile
这可能适用于您(GNU-sed):


和AWK一样好,谢谢。既然他先到了这里,我就把他交给致命的,不过谢谢你。这里是一个+1,我找到了第一个选择(结束时
/p
),以1/4的时间作为awk解决方案。第二个选项(
/!d
)花费的时间与awk相同。在一个大文件中,它开始起作用。当分隔符相同时,这也起作用。
awk
版本只有在它们不同时才有效。@akostadinov因为我们不知道当分隔符相同时预期的行为是什么,所以不能说解决方案有效或无效。类似地,如果两个分隔符出现在同一行上和/或整个输入是一行和/或如果一个分隔符是另一行的子字符串和/或包含regexp元字符和/或可能有不同数量的开始分隔符和/或结束分隔符,和/或与此问题无关的一百个其他事物中的任何一个。@EdMorton,
sed
行为在
man-sed
中的
Addresses
一节中有非常清楚的解释。它符合我的预期行为,所以我认为它是相关的,足以把它的说明。不知道是什么困扰着你。是的,这看起来是最好的+1.我很好奇:是否有使用这种模式的“从头到文件结尾”模式?(使用top awk解决方案非常简单,但不知道是否有“文件结束”标记,而不是“/Footer/”)+1,因为这是正确的答案,因为它很容易增强,以涵盖您想要打印第一行或最后一行或两行或任何其他您想要做的事情的情况。使用/start/、/end/范围的解决方案虽然稍微简短,但只要有一点需求变化,就会崩溃-这种模式使琐碎问题的解决方案稍微简短,但非琐碎问题的解决方案更冗长、更复杂,或者需要重新写入这种样式。这确实有效,但也会将整个原始文件重定向到标准输出。这也使得它很难与管道一起使用。
awk '/Header/,/Footer/' file > newfile
 sed '/^Header/,/^Footer/w new_file' file