나는 종종 다음과 같은 파일에 대한 간단한 작업을 수행합니다.
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
. sed
Blithely는 파일 이름을 인수로 허용합니다.
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를 직접 사용하세요.