选择由某些字符分隔的完整文本块

Mar*_*sse 2 bash awk grep sed

我有一个非常大的文本文件(40GB gzip),其中数据块被分隔//.

如何选择某条线符合某个标准的数据块?也就是说,我可以grep将模式和选择扩展到//分隔符的两个方向吗?我不能假设块的大小和线的位置.

not interesting 1
not interesting 2
//
get the whole block 1
MATCH THIS LINE
get the whole block 2
get the whole block 3
//
not interesting 1
not interesting 2
//
Run Code Online (Sandbox Code Playgroud)

我想用以下方法选择数据块MATCH THIS LINE:

get the whole block 1
MATCH THIS LINE
get the whole block 2
get the whole block 3
Run Code Online (Sandbox Code Playgroud)

我尝试过,sed但无法理解模式定义.例如,这应该匹配//MATCH THIS LINE:

sed -n -e '/\/\//,/MATCH THIS LINE/ p' file.txt
Run Code Online (Sandbox Code Playgroud)

但它无法匹配//.

是否可以使用GNU命令行工具实现此目的?

fed*_*qui 5

使用GNU awk(由于多字符RS),您可以将记录分隔符设置为//,以便每个记录都是一个//以字符为单位的字符集:

$ awk -v RS="//" '/MATCH THIS LINE/' file

get the whole block 1
MATCH THIS LINE
get the whole block 2
get the whole block 3

请注意,这会在上方和下方留下一条空行,因为它会在//之后捕获新行并将其打印回来,以及//结尾之前的最后一行.要删除它们,您可以管道awk 'NF'.

要在数据块之间打印分隔符,您可以说(感谢123):

awk -v RS="//" '/MATCH THIS LINE/{print RT $0 RT}' file
Run Code Online (Sandbox Code Playgroud)

  • 你应该提到这是因为多字符RS而特定于gawk. (2认同)