使用正则表达式告诉csplit在哪里拆分文件

Phi*_*ner 7 regex bash bsd csplit

我有一个大文本文件,内容设置如下:

---
title: Lorim Ipsum Dolar
---
Lorim ipsum content
---
title: Excelvier whatever 
---
Lorim ipsum content goes here.
Run Code Online (Sandbox Code Playgroud)

我正在尝试将此文件拆分为单个文件csplit.

单个文件的内容格式如下:

---
title: Lorim Ipsum Dolar
---
Lorim ipsum content
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样正确地使用---,换行符和标题 ---\ntitle

但是我无法选择它......

csplit -k products.txt '/---[^\n]title/' {99}
Run Code Online (Sandbox Code Playgroud)

我尝试了很多变化无济于事.我一直在"不配".

小智 6

您可以使用匹配的正则表达式直到行的结尾($)

你有什么想法:

csplit -k products.txt '/^title:/' {99}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 5

csplit一次读取输入文件一行,并将正则表达式应用于每一行。因此,不可能跨多行匹配正则表达式。

解决此问题的一种方法是先对输入文件进行处理,而替换---\ntitle:为csplit可以匹配的单行模式。例如,使用sed:

sed 'N;s/---\ntitle: /===\n' products.txt | csplit -k - '/===/' {*}
sed 'N;s/===\n/---\ntitle: /' -i xx*
Run Code Online (Sandbox Code Playgroud)

这将替换---\ntitle:为单行===,然后在看到该模式时进行csplit拆分。传递-为文件名告诉csplit从stdin读取。第二条sed命令撤消更改。