将文件中的部分拆分为 bash 中的单独文件

Split portions from file to separate file in bash

从这里开始,通过一些代码更改,我设法实现了目标。

现在,我想将文本保存在单独的文件中。

我试过了:

awk '/[code]:/{flag=1} flag; /[/code]:/{flag=0}{x="/home/user/split/File"++i".txt";}{print > x;}' /home/user/bigfile.nfo

但我得到很多只有一行或没有一行的文件(0 字节的空文件)

如何将[code][/code]之间的所有内容写到单独的文件中?在这些标签之间找到多少文本,就应该创建多少文件,这是我的期望

我的代码哪里出错了?

大文件内容

blavbl
[code]
sdasdasd
asdasd
...
[/code]

line X
line Y
etc
...

[code]
...
test
test
[/code]

blabla

[code]
Single line
[/code]

在 运行 脚本之后,我得到一些只有一行的文件,而不是块之间的所有文本

我希望有

File1.txt

sdasdasd
asdasd
...

File2.txt

...
test
test

File3.txt

Single line

等等

OP 当前代码的一些问题:

  • 字符[]/awk正则表达式模式中具有特殊含义;一种解决方案是在将它们作为文字字符查找时转义所述字符
  • OP 应该确保一旦没有更多的输出到所述文件就关闭文件的描述符(这应该使 awk 免于(可能)由于 'out of file descriptor' 错误而崩溃)
  • OP 的当前模式包括尾随 :,但 OP 的示例输入中不存在此类字符(即,[code]: 将不匹配 [code]

一个awk想法:

awk '
/^\[code\]/   { outfile="/home/user/split/File" ++i ".txt"; next }
/^\[\/code\]/ { close(outfile); outfile=""; next }
outfile       { print > outfile }
' bigfile.nfo

注意: 技术上 ](没有转义符 \)也应该有效

这会生成:

$ head File*.txt
==> File1.txt <==
sdasdasd
asdasd
...

==> File2.txt <==
...
test
test

==> File3.txt <==
Single line