패턴 사이의 줄을 다른 파일로 바꾸는 방법

패턴 사이의 줄을 다른 파일로 바꾸는 방법

입력 파일에 다음이 있습니다

#Start para
0 hello dq
1 world dq
2 welcomes dq
3 you dq
#Start para
0 how tq
1 are tq
2 you tq
#Start para
0 say dq
1 hello dq
2 to dq
3 the dq
4 world dq

아래와 같은 다른 파일로 이동하고 싶습니다.

#Start para
3 you dq
2 welcomes dq
1 world dq
0 hello dq
#Start para
2 you tq
1 are tq
0 how tq
#Start para
4 world dq
3 the dq
2 to dq
1 hello dq
0 say dq

sed또는 을 사용하여 이 작업을 어떻게 수행할 수 있습니까 awk? 기본적으로 단락을 뒤집고 싶습니다 #Start para. 그러나 단락의 순서는 동일하게 유지되어야 합니다.

답변1

유일한 것이 #블록의 시작 이라면 awk시도해 볼 수 있습니다

$ awk -F'\n' 'BEGIN{RS="#"}NR>1{print "#"$1;for(i=NF-1;i>1;i--)print $i}' file

결과:

#Start para
3 you dq
2 welcomes dq
1 world dq
0 hello dq
#Start para
2 you tq
1 are tq
0 how tq
#Start para
4 world dq
3 the dq
2 to dq
1 hello dq
0 say dq

답변2

그리고 sed:

sed '/#Start para/{x;G;s/^\n//;p;s/.*//;x;d};G;s/\n$//;h;$!d' input.file

다음을 포함하는 줄의 경우 #Start para변경 사항 끝에 e를 추가합니다.hold spacex패턴 공간<->예비 공간그런 다음 데이터를 반환합니다.잡다G그것을 첨부하다무늬. ( H홀드에 부착한 다음 패턴으로 돌아가서 동일한 작업을 수행할 수 있습니다 g.) 예약된 공간이 비어 있으면 패턴 공간은 빈 라인으로 시작되므로 삭제되고 s/^\n//모아진 p라인이 인쇄됩니다. 다음 명령(까지 })은 유지 및 패턴 공간을 정리하고 다음 줄로 이동하기 위한 것입니다.

다른 행(포함되지 않음 #Start para) 의 경우 G예약된 공간을 패턴에 추가하고 빈 행을 삭제한 다음(예약된 공간이 비어 있는 경우) 패턴 공간을 예약된 공간에 넣고 새 루프를 시작하여 행이 d아닌 경우 모든 것을 제거합니다. 마지막 행. 마지막 줄인 경우 기본적으로 형성된 패턴 공간이 인쇄됩니다.

답변3

보다 보수적이고 덜 난해한 접근 방식을 위해…

awk '
  /^#/ { printf "%s",out ; print ; out = "" }
  /^[0-9]/ { out = $0 RS out }
  END { printf "%s",out }
'

답변4

다음은 세 가지 접근 방식입니다.

sed 's/^#/\n#/' file | 
    perl -00lne '@A=split(/\n/); print shift(@A); print join "\n", reverse @A' | 
        grep .

설명하다

  • sed명령은 로 시작하는 각 줄 앞에 개행 문자를 추가합니다 #. 이를 통해 Perl의 단락 모드를 사용할 수 있습니다(아래 참조).
  • 펄 옵션:

    • -00"단락 모드"를 활성화하면 "줄"이 2자로 정의됩니다 \n.
    • -l:후행 줄 바꿈을 제거하고 \n각 호출 print에 a를 추가합니다 .
    • -n: 입력 파일을 한 줄씩(또는 이 경우 섹션별로) 읽습니다.
    • -e: 각 줄에서 실행될 스크립트입니다.
  • 펄 스크립트:

    • @A=split(/\n/);: 이 줄(문단)을 배열로 분할하여 @A각 개별 줄(여기서는 단락이 아닌 실제 줄)을 배열의 요소로 만듭니다.
    • print shift(@A);@A:(헤더 행)의 첫 번째 요소를 제거하고 인쇄합니다.
    • print join "\n", reverse @A': 나머지 요소를 반전시키고 @A문자를 연결하여 \n인쇄합니다.
  • grep .: 추가된 빈 줄을 제거하는 더러운 해킹입니다 sed. 그러면 최소한 하나의 문자가 포함된 모든 줄이 인쇄됩니다.

관련 정보