9

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

---
title: Lorim Ipsum Dolar
---
Lorim ipsum content
---
title: Excelvier whatever 
---
Lorim ipsum content goes here.

我正在尝试使用csplit.

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

---
title: Lorim Ipsum Dolar
---
Lorim ipsum content

我希望能够像这样正则表达式---,换行符和标题---\ntitle

但我无法选择它...</p>

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

我尝试了很多变化都无济于事。我不断得到“不匹配”。

4

5 回答 5

7

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

你有什么想法:

csplit -k products.txt '/^title:/' {99}
于 2013-08-21T18:17:26.250 回答
5

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

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

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

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

于 2013-08-21T18:01:57.453 回答
2

尝试使用{*}而不是{99}解决match not found问题。

于 2013-08-21T18:03:17.653 回答
1

这可能对您有用:

csplit -z products.txt '/^title/-1' '{*}'
于 2013-08-21T20:12:17.860 回答
0

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

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

第一个命令在遇到时声明一个新文件title:。第二个命令将一行写入fileiffile已声明。第三个命令将当前行分配给一个变量。

于 2019-05-30T12:32:25.737 回答