使用 csplit 排除分隔符

使用 csplit 排除分隔符

是否可以使用 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)更短的一步方法?只要具有合理的可读性,就不会优先选择使用的工具。

答案1

由于您似乎正在使用gnu csplit,所以这很简单:

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

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


根据您的注释,此选项仅适用于更新版本的csplit( coreutils≥ 8.22)

答案2

如果您可以使用字符串匹配而不是正则表达式匹配

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

答案3

perl -ne 'BEGIN { $fnum=0; open $fh, ">", sprintf "xx%02d", $fnum++ } if (m/-/) { open $fh, ">", sprintf "xx%02d", $fnum++ } else { print $fh $_ }' inputfileorfileshere

或者类似的通过或其他方式重新打开匹配适当行的新文件awk

相关内容