입력 파일에 다음이 있습니다
#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 space
x
패턴 공간<->예비 공간그런 다음 데이터를 반환합니다.잡다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
. 그러면 최소한 하나의 문자가 포함된 모든 줄이 인쇄됩니다.