stdin 또는 파일을 버퍼링 할 수있는 프로그램


12

도움을주기 위해 임시 파일을 사용하는 것 외에도을 /를 stdin얻을 때까지 입력을 버퍼링 할 수 있지만 내용을 출력하지 않는 방법 / 프로그램이 있습니까 EOF? 쉘 변수를 사용하고 싶지 않습니다 (예 :) buffer=$(cat).

이 프로그램은 다음과 같이 작동해야합니다 (프로그램 이름이이라고 가정 buffered-cat).

$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)

이제 프로그램이 수신 한 ^D상기에서는 buffered-cat컨텐츠를 출력

line 1
line 2
line 3

나는 보통 sort이 목적 으로 사용 합니다. 분명히 바람직하지 않은 부작용이 있습니다.
Adrian Pronk

답변:


20

가난한 사람이 sponge사용하는 awk:

awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'

이 있으면 tac오용 할 수도 있습니다.

... | tac | tac

1
tac간단하고 우아합니다.
Ekeyme Mo

6
@EkeymeMo | tac | tac 간단하지만 작업에는 비효율적이며 특히 큰 파일의 경우 성능이 저하 될 수 있습니다.
Digital Trauma

@DigitalTrauma 그래, 그 단점을 알고있다. 10 만 줄의 파일을 테스트합니다. 전 괜찮아요. 나는 당신의 의견을 진실로 투표했습니다.
Ekeyme Mo

29

spongemoreutils 에서이 작업을 수행 할 수 있습니다 . sponge"표준 입력을 흡수하고 파일에 씁니다". 인수가 없으면 해당 파일은 표준 출력입니다. 이 명령에 제공된 입력은 EOF까지 메모리에 저장되고 한 번에 모두 기록됩니다.

일반 파일에 쓰려면 파일 이름을 지정할 수 있습니다.

cmd | sponge filename

주요 목적은 sponge파이프 라인 내에서 동일한 파일을 읽고 쓸 수 있도록하는 것이지만 원하는 작업도 수행합니다.


6

입력이 ASCII 텍스트 인 경우 (끝까지 NUL 0x0 바이트가 포함되지 않음) sed -z원하는 것을 수행합니다.

$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$ 

-z원인은 sed행 구분 기호 대신에 일반적인 줄 바꿈으로 NUL 바이트를 처리합니다. 입력이 NUL 바이트가없는 일반 텍스트 인 경우 sed는 EOF에 도달 할 때까지 전체 입력을 패턴 버퍼로 계속 읽습니다. sed그런 다음 버퍼에서 처리하지 않고 출력합니다.


입력에 NUL 바이트가 있으면 대신이 작업을 수행 할 수 있습니다.

sed ':l;N;bl'

4

sed솔루션은 DigitalTrauma보다 약간 길지만 NUL 바이트에서도 작동합니다.

sed -n 'H;${x;s/^\n//;p}'

2
sed ':l;N;bl'작동해야합니다.
Digital Trauma

1

당신이 요구하는 행동은 단순한 고양이의 기본 행동이 아닙니까?

gv@debian:$ cat << EOF #or cat <<EOF >file or cat <<EOF >/dev/stdout
> Line 1
> Line 2
> Line 3
> EOF
Line 1
Line 2
Line 3
gv@debian:$

3
아니요, 여기 문서의 동작입니다. 입력을 시도 cat(입력) Line 1(입력) 어떻게되는지.
G-Man은 'Reinstate Monica'라고

그렇습니다. 이것은 문서 구조입니다. 간단하고 OP가 원하는 것에 매우 가깝습니다. 설치가 필요하지 않습니다
Sergiy Kolodyazhnyy

1

파이썬을 제외하고 muru의 awk 예제와 같은 아이디어. CtrlD줄에서 읽기를 중지하는 데 사용

$ python -c 'import sys;print("".join(sys.stdin.readlines()))'                                                           
line1
line2
line3 # press Enter and Ctrl+D at this point
line1
line2
line3

3
또는 perl -e 'print <>'(!)
dave_thompson_085
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.