> brew install moreutils
==> Downloading https://homebrew.bintray.com/bottles/moreutils-0.55.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring moreutils0.55.yosemite.bottle.tar.gz
답변1
이라는 파일이 있고 in 으로 시작하는 input
모든 줄을 제거하고 싶다고 가정해 보겠습니다 . 다음으로 시작하지 않는 모든 줄을 얻을 수 있습니다 .#
input
#
grep -v '^#' input
하지만 어떻게 변경하나요 input
? 표준 POSIX 도구 상자를 사용하면 다음과 같은 임시 파일을 사용해야 합니다.
grep -v '^#' input >/tmp/input.tmp
mv /tmp/input.tmp ./input
셸 리디렉션을 사용합니다.
grep -v '^#' input >input
input
읽기 전에 잘립니다 .
그렇게 하면 다음을 sponge
수행할 수 있습니다.
grep -v '^#' input | sponge input
답변2
이것기타 유틸리티 홈 페이지그 자체로 일반적인 사용 사례를 문서화합니다.
sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
여기서는 /etc/passwd가 기록되고 읽혀지며 수정되고 있습니다. 쓰기 전에 표준 입력을 정리하지 않으면 /etc/passwd가 손상될 수 있습니다(읽는 동안 파일이 변경되기 때문).
답변3
sponge
내가 읽은 가장 간단한 예:
$ cat file1
I
You
Me
We
Us
정렬하려면 간단히
$ sort file1 > file1_sorted
그러나 을 사용하면 sponge
동일한 파일을 읽고 쓸 수 있습니다.
$ sort file1 | sponge file1
임시 파일이 필요하지 않습니다 file1_sorted
. 이는 sponge
STDIN에서 먼저 읽은 다음 STDOUT
별도의 단계로 에 기록하여 읽기 중에 파일이 변경될 경우 파일이 손상되는 것을 방지하기 때문입니다 .