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

上記の作業は2つのステップで実行できますが、1つのステップで実行できますか?

csplitを使用して実行できない場合、上記の2つの呼び出し(csplit + sed)よりも短い1段階の方法はありますか?合理的に読むことができる限り、使用されたツールは優先順位がありません。

答え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

関連情報