Csplit

使用 csplit 排除分隔符

  • May 11, 2016

是否可以使用 csplit 刪除分隔符?例子:

$ cat in
abc
---
def
---
ghi
$ csplit -q in /-/ '{*}'
$ ls x*
xx00  xx01  xx02
$ head xx*
==> xx00 <==
abc

==> xx01 <==
---
def

==> xx02 <==
---
ghi

而不是它所做的,即拆分並保留分隔符,是否可以要求拆分並刪除分隔符?

也就是說,所需的輸出將是這樣的:

$ sed -i '/-/d' xx*
$ head xx*
==> xx00 <==
abc

==> xx01 <==
def

==> xx02 <==
ghi

雖然可以如上所述分兩步完成,但可以一步完成嗎?

如果不能用 csplit 完成,有沒有比上面的兩個呼叫(csplit + sed)更短的一步法?只要它具有合理的可讀性,就不會偏愛使用的工具。

如果您可以使用字元串匹配而不是正則表達式匹配

awk 'BEGIN {RS="---\n"; ORS=""} {print > sprintf("xx%02d", NR)}' in

使用 GNU awk(至少在 v4.0.1 中)可以使用正則表達式*,*RS例如

gawk 'BEGIN {RS="-+\n"; ORS=""} {print > sprintf("xx%02d", NR)}' in

由於您似乎正在使用gnu csplit,這很簡單:

csplit --suppress-matched infile /PATTERN/ '{*}'

即用於--suppress-matched抑制匹配的行PATTERN


根據您的說明,此選項僅適用於csplit( coreutils≥ 8.22)的更新版本

引用自:https://unix.stackexchange.com/questions/281338