moreutils의 스폰지-쉘 리디렉션의 차이점은 무엇입니까? 유용한 예?


16
> 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       
🍺  /usr/local/Cellar/moreutils/0.55: 67 files, 740K   

sponge은 표준 입력을 읽고 지정된 파일에 씁니다. 쉘 재 지정과 달리 스폰지는 출력 파일을 쓰기 전에 모든 입력을 흡수합니다. 이를 통해 동일한 파일에서 읽고 쓰는 파이프 라인을 구성 할 수 있습니다.

이해가 안 돼요 유용한 예를 들어주세요.

흡수 는 무엇 의미합니까?



또 다른 예는 expand foo.txt | sponge foo.txt입니다. 또한보십시오 : stackoverflow.com/a/33639324/1959808
Ioannis Filippidis

tl; dr 출력 파일을 자르기 전에sponge 입력을 "흡수"
BallpointBen

답변:


33

라는 파일이 있다고 가정하고 in으로 input시작하는 모든 행을 제거하려고합니다 . 다음을 사용하여 모든 줄을 시작하지 않아도 됩니다.#input#

grep -v '^#' input

그러나 어떻게 변경 input합니까? 표준 POSIX toolchest를 사용하면 다음과 같은 임시 파일을 사용해야합니다.

grep -v '^#' input >/tmp/input.tmp
mv /tmp/input.tmp ./input

쉘 재 지정으로 :

grep -v '^#' input >input

input당신이 그것을 읽기 전에 잘립니다 .

을 사용하면 다음 sponge을 수행 할 수 있습니다.

grep -v '^#' input | sponge input

4
실제로 바이트를 변환하는 동안 <>연산자를 사용하여 파일을 안전하게 읽고 쓸 수 있습니다 .
Chris Down

@ChrisDown : 그렇습니다, 나는 그것을 꾸미지 않고 의미합니다
cuonglm

"부패"에 대해 당신이 무엇을 의미하는지 잘 모르겠습니다. 달리 >하고 <, <>파일이 손상하지 않는 뭔가 정말 잘못하지 않는 한. 그것을 사용하여 바이트 단위로 쉽게 쓸 수 있습니다. 예를 들어와 함께 사용해보십시오 tr.
Chris Down

@ChrisDown : 혼란을 피하기 위해 문장을 제거하겠습니다. 실제로을 사용할 때 <>file읽고 쓰기 위해 파일을 열지 만 실제로 파일에 아무것도 쓰지 않습니다.
cuonglm

1
@ChrisDown이 만들고자하는 요점은 <>파일을 자르지 않고 기존 바이트를 새 출력으로 바꾸는 것입니다. 새 출력이 너무 짧으면 파일 끝에 가비지가 남게됩니다. 그러나 새로운 출력이 충분히 길면 위험이 없습니다.
BallpointBen

8

moreutils 홈 페이지 자체는 일반적인 사용 사례를 문서화 :

sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd

여기서 / etc / passwd는 읽고 쓰는 중이며 수정 중입니다. 쓰기 전에 stdin을 제거하지 않으면 / etc / passwd가 손상 될 수 있습니다 (읽는 동안 파일이 변경됨).


그리고 그것은 당신이 한 방법을 설명했다면 moreutils 페이지에서 좋은 예가 될 것입니다 :-)
Br.Bill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.