gąbka z moreutils - jaka jest różnica w przekierowaniu powłoki? przydatne przykłady?


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 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 ?



Innym przykładem jest expand foo.txt | sponge foo.txt. Zobacz także: stackoverflow.com/a/33639324/1959808
Ioannis Filippidis

tl; dr sponge„wchłania” dane wejściowe przed obcięciem pliku wyjściowego
BallpointBen

Odpowiedzi:


33

Załóżmy, że masz plik o nazwie input, chcesz usunąć wszystkie linie zaczynające się od #in input. Możesz uzyskać, że wszystkie linie nie zaczynają się od #użycia:

grep -v '^#' input

Ale jak wprowadzasz zmiany input? W standardowym zestawie narzędzi POSIX musisz użyć pliku tymczasowego, na przykład:

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

Z przekierowaniem powłoki:

grep -v '^#' input >input

zostanie obcięty, inputzanim zaczniesz z niego czytać.

Za pomocą spongemożesz:

grep -v '^#' input | sponge input

4
Możesz jednocześnie odczytywać i zapisywać plik jednocześnie, o ile bajty są transformowane tylko za pomocą <>operatora.
Chris Down,

@ChrisDown: Tak, to znaczy bez robienia tego
cuonglm

Nie jestem pewien, co masz na myśli mówiąc o „zrobieniu zepsucia”. W przeciwieństwie do >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 z tr.
Chris Down,

@ChrisDown: Pozwól mi usunąć to zdanie, aby uniknąć pomyłek. Mam na myśli to <>file, że kiedy używasz , otwierasz plik do odczytu i zapisu, ale tak naprawdę nic nie zapisujesz do pliku.
cuonglm

1
Myślę, że @ChrisDown próbuje, aby <>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.
BallpointBen,

8

Sama strona główna moreutils dokumentuje typowy przypadek użycia:

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

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).


Byłby to dobry przykład na stronie moreutils, gdyby wyjaśnił, jak to zrobiłeś :-)
Br.Bill
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.