-b, --이전
구분 기호는 파일에서 앞에 있는 레코드의 시작 부분에 추가됩니다.
다음 출력을 이해할 수 없습니다.
$ echo -e "Hello\nNew\nWorld\n!" > file
$ tac file
!
World
New
Hello
$ tac -b file
!
World
NewHello
New
와 사이에 개행 문자가 없는 이유는 무엇입니까 Hello
?
답변1
tac
레코드와 구분 기호를 사용하세요.함께 제공, 기본값은 해당 레코드 뒤입니다. 이는 구분 기호 분리를 수행하는 AWK와 같은 다른 레코드 기반 도구에 비해 약간 직관에 어긋납니다.
의 경우 -b
개행 문자가 추가된 레코드는 다음과 같습니다(원래 순서대로).
Hello
\nNew
\nWorld
\n!
\n
역방향 출력은
\n\n!\nWorld\nNewHello
이는 여러분이 보는 출력에 해당합니다.
그렇지 않은 경우 -b
레코드와 추가된 줄 바꿈은 다음과 같습니다.
Hello\n
New\n
World\n
!\n
역방향 출력은
!\nWorld\nNew\nHello\n
답변2
나에게는 이것이 이상하게 보입니다. 부분적으로는 tac
그것이 작동하는 방식이 약간 반직관적이기 때문입니다. 명확하게 보이는 구분 기호인 쉼표를 사용하겠습니다.
다음 명령의 결과를 보고 싶습니다.
% echo -ne 'A,B,C' | tac -s,
?
글쎄요, A는 B와 별개이고 B는 C와 별개라고 생각합니다. 그래서 (내 결론은) 역방향으로 인쇄하면 C,B,A
. 점검 해보자. 아아, 다르게 인쇄됩니다.
% echo -ne 'A,B,C' | tac -s,
CB,A,
tac
원래 구분 기호가 있던 막대가 있다고 결론을 내릴 수 있습니다 . A
그 후에도 여전히 있고, B
있지만 C
없으면 그대로 인쇄됩니다.
tac
이 시간을 가지고 달리면 -b
어떻게 될까요 ?
% echo -ne 'A,B,C' | tac -bs,
,C,BA
다음과 같이 작동하는 것 같습니다 -b
. 구분 기호를 찾을 때까지 입력을 거꾸로 반복합니다. 인쇄된 것을 발견했습니다:
,
. 그런 다음 검색하는 동안 건너뛴 텍스트를 인쇄합니다.
C
. 그런 다음 루프를 반복합니다.
,B
. 남은 구분 기호가 없으므로 나머지 부분만 인쇄됩니다.
A
.
New와 Hello 사이에 개행 문자가 없는 이유는 무엇입니까?
위에서 설명한 설명에 따르면 New
개행 문자가 앞에 붙기 때문에 새 줄에 표시되지만 Hello
그렇지 않기 때문에 있는 그대로 인쇄됩니다.