Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用regex告诉csplit在哪里拆分文件_Regex_Bash_Bsd_Csplit - Fatal编程技术网

使用regex告诉csplit在哪里拆分文件

使用regex告诉csplit在哪里拆分文件,regex,bash,bsd,csplit,Regex,Bash,Bsd,Csplit,我有一个大文本文件,内容设置如下: --- title: Lorim Ipsum Dolar --- Lorim ipsum content --- title: Excelvier whatever --- Lorim ipsum content goes here. 我正在尝试使用csplit将此文件拆分为单个文件 各个文件的内容格式如下: --- title: Lorim Ipsum Dolar --- Lorim ipsum content 我希望能够像这样对--、新行和标题进行正

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

---
title: Lorim Ipsum Dolar
---
Lorim ipsum content
---
title: Excelvier whatever 
---
Lorim ipsum content goes here.
我正在尝试使用
csplit
将此文件拆分为单个文件

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

---
title: Lorim Ipsum Dolar
---
Lorim ipsum content
我希望能够像这样对--、新行和标题进行正则化

但我无法选择它与

csplit -k products.txt '/---[^\n]title/' {99}

我试过很多变体,但都没有用。我一直得到“不匹配”。

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

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

sed 'N;s/---\ntitle: /===\n' products.txt | csplit -k - '/===/' {*}
sed 'N;s/===\n/---\ntitle: /' -i xx*

这将用一行替换
-\n标题:
,然后在看到该模式时进行csplit拆分。将
-
作为文件名传递,告诉csplit从stdin读取。第二个sed命令会反转更改。

尝试使用
{*}
而不是
{99}
来修复
未找到匹配的问题。

您可以使用一个匹配到行尾的正则表达式(
$

您认为:

csplit -k products.txt '/^title:/' {99}

这可能适合您:

csplit -z products.txt '/^title/-1' '{*}'

对我来说,答案是不要使用
csplit
,使用
awk

awk '
/^title:/ {++count; file="file"count".txt"; print file}
file {print line > file}
{line=$0}
' products.txt

当遇到
标题:
时,第一个命令声明一个新文件。如果已声明
file
,则第二个命令将前一行写入
file
。第三个命令将当前行分配给一个变量。

我不知道有关
csplit
,但您是否尝试过
/--[\r\n]+title/
?(
[^…]
是一个否定类,有时会有回车符和换行符)。我相信
{99}
只是告诉
csplit
重复这个过程需要多少时间。无论如何,在我的BSD版本中,
{*}
将不起作用。看@PhilipMeissner这很有趣。在debian下,csplit将始终尝试查找指定数量的匹配项,如果找不到99个匹配项,则将抛出一个错误<代码>csplit--版本
csplit(GNU coreutils)8.21
我希望它能做多行交易,但这确实有效。