깨끗하고 명확한 POSIX와 동등한 것이 있습니까 tac
?
가독성과 간결성을 모두 고려해야 합니다.
답변1
가장 깨끗한POSIX동등하다
tail -r
~처럼
-r Reverse. Copies lines from the specified starting point in
the file in reverse order. The default for r is to print the
entire file in reverse order.
다음에 수락됨POSIX질문(곧 모든 플랫폼에서 지원되길 바랍니다.)
이것이 가능 하지 tail -r
않다면 (당신과 다른 사람들이 시연한 것처럼) "클래식" 텍스트 처리 도구를 성공적으로 사용하여 파일의 줄을 바꿀 수 있습니다.
가독성과 간결함은 제쳐두고, 오래된 것조차도 ed
이것을 할 수 있습니다:
ed -s infile <<\IN
g/^/m0
,p
q
IN
또는 파이프의 출력을 반전시키려면 먼저 텍스트 버퍼로 읽어보세요.
ed -s <<\IN
r ! your | pipeline | goes | here
g/^/m0
,p
q
IN
답변2
sed
"일반인"이 읽을 수는 없지만 다음과 같은 한 줄의 코드로 이 작업을 수행 할 수 있습니다 .
sed -n '1h;1!{x;H;};${g;p;}' file.txt
설명하다:
-n
sed
각 줄의 인쇄를 비활성화하는 기본 동작입니다.
1h
첫 번째 행이 예약된 공간에 저장됩니다.
1!{...}
이 명령 블록을 모든 줄에 적용와는 별개로첫 번째로.
x
홀드 공간과 패턴 공간을 교환합니다. (패턴 공간은 각 라인이 처리될 때 저장되는 곳입니다.) H
그런 다음 개행 문자가 예약된 공간에 추가되고 그 뒤에 패턴 공간의 (새) 내용이 추가됩니다.
${...}
마지막 블록은 마지막 행에 도달한 경우에만 적용됩니다. g
예약된 공간의 내용을 가져와서 패턴 공간에 넣고 p
패턴 공간을 인쇄합니다.
물론 이는 전체 파일을 메모리에 한 번에 보관할 수 있는지 여부에 따라 달라집니다. 매우 큰 파일에서는 실패할 수 있습니다.
답변3
다음은 전체 파일을 메모리에 저장하는 awk 스크립트입니다.
awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' file
쉘 함수로 표현하면 다음과 같습니다.
tac () { awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' "$@"; }
답변4
나는 선호한다육어쨌든 결과를 보고 싶다면 직접 할 수 있습니다.
물론 명령 모드는 다음과 같습니다.
:g/^/m0
전체 파일을 되돌리고 싶지 않은 경우 콘텐츠가 이동되는 위치와 방법에 주의하는 한 언제든지 :ga 범위를 지정할 수 있습니다.
:1,10g/^/m0
ed
다음을 사용하여 스크립트를 작성할 수 있습니다 .ex
$ ed -s infile <<IN
g/^/m0
,p
w
IN
그리고
$ ex -s infile <<EOS
g/^/move0
wq
EOS
나는 항상 이것을 한다.
"-r"은 다음으로 전환됩니다.꼬리게시 당시 POSIX와 호환되지 않음:
tail [-f] [-c number|-n number] [file]