파일 읽기: 시작 및 끝 패턴을 포함하여 패턴 사이의 모든 텍스트를 선택하고 각 패턴 세트에 대해 새 파일을 만듭니다.

파일 읽기: 시작 및 끝 패턴을 포함하여 패턴 사이의 모든 텍스트를 선택하고 각 패턴 세트에 대해 새 파일을 만듭니다.

다음을 포함 하는 Linux라는 파일이 있습니다 file.txt.

sqlplus -s insert into table;  
commit;  
!  
sqlplus -s insert into table;  
commit;  
!  
sqlplus -s insert into table;  
commit;  
!
  
.  
.   

다음과 같이 여러 파일을 만들고 싶습니다.

파일 1.txt:-

sqlplus -s insert into table;  
commit;  
!   

파일 2.txt

sqlplus -s insert into table;  
commit;  
!   

답변1

사용awk

$ awk '/^sqlplus/ {close(sql);sql="file"++c".txt"} {print > sql}' input_file
$ head *
==> file1.txt <==
sqlplus -s insert into table;
commit;
!

==> file2.txt <==
sqlplus -s insert into table;
commit;
!

==> file3.txt <==
sqlplus -s insert into table;
commit;
!

.
.

답변2

일반적인 작업 awk:

START_PATTERN='^sqlplus -s' END_PATTERN='^!$' awk '
  !file && $0 ~ ENVIRON["START_PATTERN"] {
    file = sprintf("file%03d.txt", ++n)
  }
  file {
    print > file
    if ($0 ~ ENVIRON["END_PATTERN"]) {
      file = ""
      close(file)
    }
  }' < your-file

이 접근 방식을 사용하면 행이 시작 및 끝 패턴과 일치할 수 있습니다(귀하의 경우에는 불가능함).

답변3

원본 입력 파일의 세 줄마다 파일을 만드는 것으로 충분하다면 다음을 수행할 수 있습니다(GNU 사용 awk).

awk 'NR%3==1{a++} {print > "file"a".txt"}' file.txt 

데이터에 대해 이 명령을 실행하면 다음이 생성됩니다.

$ ls file?.txt 
file1.txt  file2.txt  file3.txt

답변4

더 간단한 솔루션csplit

csplit infile -z -f 'file' '/^sqlplus/' '{*}'


╰─ → $ cat file00
sqlplus -s insert into table;
commit;
!
╰─ → $ cat file01
sqlplus -s insert into table;
commit;
!
╰─ → $ cat file02
sqlplus -s insert into table;
commit;
!

-f접두사를 설정하고 -z빈 파일을 억제하는 데 사용됩니다.

관련 정보