我需要在文件中获取多次出现的 X 到 Y,每次匹配一个出现时,它都会保存到文件中。
这是一个示例文件(demo.txt):
\x00START how are you? END\x00
\x00START good thanks END\x00
sometimes random things\x00\x00 inbetween it (ignore this text)
\x00START thats nice END\x00
现在,运行命令后,每个文件(/folder/demo1.txt、/folder/demo2.txt 等)除了“START”之外,还应具有\x00START 和 END\x00 之间的内容(\x00 为空) ' 但不是 'END'。
/folder/demo1.txt 应该显示“START 你好吗?”,/folder/demo2.txt 应该显示“START 非常感谢”。
所以基本上它应该管道“你好吗?”并使用“echo”我可以在前面添加“START”。
值得注意的是,我正在处理一个非常大的二进制文件。
我目前正在使用
sed -n -e '/\x00START/,/END\x00/ p' demo.txt > demo1.txt
但这并没有按预期工作(它在“\x00START”之前获取行,并且不会在第一个“END\x00”处停止)。
最佳答案
如果您有 GNU awk
,请尝试:
awk -v RS='\0START|END\0' '
length($0) {printf "START%s\n", $0 > ("folder/demo"++i".txt")}
' demo.txt
RS='\0START|END\0'
定义一个正则表达式,充当[输入]记录分隔符,它将输入文件按字符串(字节)分成记录序列)位于\0START
和END\0
之间(\0
在此表示NUL
(空字符))。- 使用多字符、基于正则表达式的单独记录不符合 POSIX 标准; GNU
awk
支持它(mawk
一般情况下也支持它,但似乎不支持NUL
) > 字符。)。
- 使用多字符、基于正则表达式的单独记录不符合 POSIX 标准; GNU
- 模式
length($0)
确保仅当记录非空时才执行关联操作 ({...}
)。 {printf "START%s\n", $0 > ("folder/demo"++i)}
输出前面带有"START"
的每个非空记录,到文件folder/demo{n}.txt"
中,其中{n}
表示以1
开头的序列号。
关于regex - 管道 sed 命令创建多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24663358/