我有一个大文本文件,内容设置如下:
---
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}
我尝试了很多变化无济于事。我一直在“不配”。
答案 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
。第三个命令将当前行分配给变量。