파이프라인 명령 체인 내에서 "전체 파일 버퍼링"을 수행하는 방법이 있습니까?

파이프라인 명령 체인 내에서 "전체 파일 버퍼링"을 수행하는 방법이 있습니까?

나는 종종 다음과 같은 파일에 대한 간단한 작업을 수행합니다.

cat file1.txt|sed -r 's/^ *//'

줄 시작 부분의 공백을 제거합니다. 파일을 덮어쓰려면 내가 아는 유일한 방법은 다음과 같습니다.

cat file1.txt|sed -r 's/^ *//' > file2.txt
mv file2.txt file1.txt

file2.txt가 존재하는지 확인해야 하고, 명령을 하나가 아닌 두 개 써야 하는 등 매우 귀찮습니다.

그래서 저는 파이프라인 명령 체인에서 전체 파일 버퍼링을 수행할 수 있는 방법이 있을까?라고 생각했습니다. 그래서 나는 다음과 같이 쓸 수 있다:

cat file1.txt| magicbuffercommand |sed -r 's/^ *//' > file1.txt

명령은 버퍼링(물론 최대 바이트까지)하고 EOF를 기다린 다음 stdout에 쓰기를 시작해야 합니다.

그런 일을 할 수 있는 일이 있나요?

답변1

당신은 필요하지 않습니다cat. sedBlithely는 파일 이름을 인수로 허용합니다.

sed 's/^ *//' <file>

GNU sed를 사용하는 경우 -i또는 스위치를 사용하여 --in-place파일을 그 자리에서 편집 할 수 있습니다.

sed -i 's/^ *//' <file>

sponge이 질문에 대답하려면 다음 도구를 사용하여 "전체 파일 버퍼링"을 구현할 수 있습니다. 더 많은 유틸리티 패키지. 이것을 사용하면 sponge다음을 수행할 수 있습니다.

<command> <file> | sponge <file>  # or
<command1> < <file> | <command2> | sponge <file>

귀하의 sed예를 사용하면 다음과 같습니다.

sed 's/^ *//' <file> | sponge <file>

답변2

Linux 버퍼 명령을 보셨나요? 이는 사용자 공유 메모리 세그먼트를 활용하여 본질적으로 동시 읽기/쓰기를 허용합니다. 공유 메모리 세그먼트가 충분히 크면 전체 파일을 버퍼링할 수 있을 것 같습니다.

buffer 명령은 자동으로 설치되지 않을 수 있지만 다양한 Linux 배포판의 여러 저장소에서 이 프로그램을 찾았습니다. 최악의 점은 구글에서 소스 코드를 찾아 직접 컴파일/링크할 수 있다는 것입니다.

나는 버퍼를 사용하여 테이프 드라이브와 같은 느린 장치에 대한 쓰기 속도를 높이고 전송 시간을 약 10-20% 단축합니다.

답변3

또 다른 가능성은 파일의 전체 내용을 쉘 변수에 넣는 것입니다. 예전에는 크기 제한이 있었지만 더 이상 문제가 되지 않는 것으로 알고 있습니다. 메모리가 있는 한(물론 물리적 메모리를 초과하면 스왑이 발생함) 다음을 시도해 볼 수 있습니다.

예를 들어:

 varx=`cat filename`
 echo "$varx" | sed ..... >$filename

sed 명령이 아닌 다른 명령을 사용하려는 경우에만 이것을 언급합니다.

답변4

cat 명령은 쓸모가 없습니다. 콘텐츠를 인쇄하거나 -i내부 편집을 위해 sed를 직접 사용하세요.

관련 정보