regex - 管道 sed 命令创建多个文件

标签 regex shell command-line sed

我需要在文件中获取多次出现的 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' 定义一个正则表达式,充当[输入]记录分隔符,它将输入文件按字符串(字节)分成记录序列)位于 \0STARTEND\0 之间(\0 在此表示 NUL(空字符))。
    • 使用多字符、基于正则表达式的单独记录不符合 POSIX 标准; GNU awk 支持它(mawk 一般情况下也支持它,但似乎不支持 NUL) > 字符。)。
  • 模式 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/

相关文章:

linux - 用于验证 SVN 项目有效性的 Bash 脚本

linux - 在没有dos2unix的情况下递归地转换目录和子目录中所有文件的所有EOL(dos-> unix)

powershell - 使用命令行检查nuget包是否存在

java - 用于解析 java 枚举的正则表达式

mysql - 避免在 mysql 选择查询中选择字母表

正则表达式字符串查找不以 91 开头的数字

maven - 为什么批处理中的一组命令在仅运行某些命令后往往会停止?

regex - IPv6 正则表达式 (RegEx) 在 PL/SQL 中不起作用

c - C 中的 pipe、fork 和 shell 命令

linux - shell,删除名称末尾的空格