使用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
我希望它能做多行交易,但这确实有效。