是否可以使用 csplit 删除分隔符?例子:
$ cat in
abc
---
def
---
ghi
$ csplit -q in /-/ '{*}'
$ ls x*
xx00 xx01 xx02
$ head xx*
==> xx00 <==
abc
==> xx01 <==
---
def
==> xx02 <==
---
ghi
Run Code Online (Sandbox Code Playgroud)
而不是它所做的,即拆分并保留分隔符,是否可以要求它拆分并删除分隔符?
也就是说,所需的输出是这样的:
$ sed -i '/-/d' xx*
$ head xx*
==> xx00 <==
abc
==> xx01 <==
def
==> xx02 <==
ghi
Run Code Online (Sandbox Code Playgroud)
虽然可以像上面那样分两步完成,但是可以一步完成吗?
如果不能用 csplit 完成,有没有比上面的两个调用(csplit + sed)更短的一步法?不偏爱使用的工具,只要它具有合理的可读性。
由于您似乎正在使用gnu csplit
,因此非常简单:
csplit --suppress-matched infile /PATTERN/ '{*}'
Run Code Online (Sandbox Code Playgroud)
即用于--suppress-matched
抑制匹配的行PATTERN
。
根据您的说明,此选项仅适用于csplit
( coreutils
?8.22) 的更新版本
如果您可以使用字符串匹配而不是正则表达式匹配
awk 'BEGIN {RS="---\n"; ORS=""} {print > sprintf("xx%02d", NR)}' in
Run Code Online (Sandbox Code Playgroud)
使用 GNU awk(至少在 v4.0.1 中),可以使用正则表达式,RS
例如
gawk 'BEGIN {RS="-+\n"; ORS=""} {print > sprintf("xx%02d", NR)}' in
Run Code Online (Sandbox Code Playgroud)