> 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 odczytuje standardowe wejście i zapisuje je w określonym pliku. W przeciwieństwie do przekierowania powłoki, gąbka wchłania wszystkie dane wejściowe przed zapisaniem pliku wyjściowego. Umożliwia to tworzenie potoków, które odczytują i zapisują do tego samego pliku.
Nie rozumiem. Proszę podać kilka użytecznych przykładów.
Co oznacza nasiąkanie ?
expand foo.txt | sponge foo.txt
. Zobacz także: stackoverflow.com/a/33639324/1959808sponge
„wchłania” dane wejściowe przed obcięciem pliku wyjściowegoOdpowiedzi:
Załóżmy, że masz plik o nazwie
input
, chcesz usunąć wszystkie linie zaczynające się od#
ininput
. Możesz uzyskać, że wszystkie linie nie zaczynają się od#
użycia:Ale jak wprowadzasz zmiany
input
? W standardowym zestawie narzędzi POSIX musisz użyć pliku tymczasowego, na przykład:Z przekierowaniem powłoki:
zostanie obcięty,
input
zanim zaczniesz z niego czytać.Za pomocą
sponge
możesz:źródło
<>
operatora.>
i<
,<>
nie uszkadza pliku, chyba że coś poszło naprawdę nie tak. Używając go, możesz dość łatwo pisać bajt po bajcie. Na przykład spróbuj użyć go ztr
.<>file
, że kiedy używasz , otwierasz plik do odczytu i zapisu, ale tak naprawdę nic nie zapisujesz do pliku.<>
nie obcinać pliku, a jedynie zastępować istniejące bajty nowymi danymi wyjściowymi. Jeśli nowy wynik jest zbyt krótki, na końcu pliku pozostaną śmieci. Ale jeśli nowa produkcja jest wystarczająco długa, nie ma ryzyka.Sama strona główna moreutils dokumentuje typowy przypadek użycia:
Tutaj plik / etc / passwd jest zapisywany i odczytywany oraz jest modyfikowany. Bez poprawiania standardowego wejścia przed zapisaniem plik / etc / passwd może być uszkodzony (ponieważ plik zmieniał się podczas odczytu).
źródło