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단계 방법이 있습니까? 합리적으로 읽을 수 있는 한 사용된 도구는 우선순위가 없습니다.

답변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.

관련 정보