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

时间:2013-08-21 17:52:45

标签: 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

我希望能够正则表达---,换行符和&标题如此---\ntitle

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

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

我尝试了很多变化无济于事。我一直在“不配”。

5 个答案:

答案 0 :(得分:5)

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

您如何看待:

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

答案 1 :(得分:4)

csplit一次读取一行输入文件,并将正则表达式应用于每一行。因此,无法在多行中匹配正则表达式。

解决这个问题的另一种方法是首先按下输入文件,用csplit可以匹配的单行模式替换---\ntitle:。例如,使用sed:

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

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

答案 2 :(得分:1)

尝试使用{*}代替{99}来修复match not found问题。

答案 3 :(得分:1)

这可能对您有用:

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

答案 4 :(得分:0)

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

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

title:被加密时,第一个命令声明一个新文件。如果已声明file,则第二条命令将上一个行写入file。第三个命令将当前行分配给变量。