éponge de moreutils - quelle est la différence avec la redirection shell? des exemples utiles?


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   

l'éponge lit l'entrée standard et l'écrit dans le fichier spécifié. Contrairement à une redirection de shell, l'éponge absorbe toutes ses entrées avant d'écrire le fichier de sortie. Cela permet de construire des pipelines qui lisent et écrivent dans le même fichier.

Je ne comprends pas. Veuillez me donner quelques exemples utiles.

Qu'est-ce que l' absorption signifie?



Un autre exemple est expand foo.txt | sponge foo.txt. Voir aussi: stackoverflow.com/a/33639324/1959808
Ioannis Filippidis

tl; dr sponge"absorbe" son entrée avant de tronquer le fichier de sortie
BallpointBen

Réponses:


33

Supposons que vous ayez un fichier nommé input, vous souhaitez supprimer toutes les lignes commençant par #in input. Vous pouvez obtenir que toutes les lignes ne commencent pas #par:

grep -v '^#' input

Mais comment apportez-vous des modifications à input? Avec les outils POSIX standard, vous devez utiliser un fichier temporaire, quelque chose comme:

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

Avec redirection shell:

grep -v '^#' input >input

sera tronqué inputavant de vous en lire.

Avec sponge, vous pouvez:

grep -v '^#' input | sponge input

4
En fait, vous pouvez lire et écrire un fichier en même temps en toute sécurité tant que les octets ne sont transformés qu'en utilisant l' <>opérateur.
Chris Down

@ChrisDown: Oui, je veux dire sans que cela se corrige
cuonglm

Je ne sais pas trop ce que vous voulez dire par "le rendre corrompu". Contrairement à >et <, <>ne corrompt pas le fichier sauf si quelque chose a vraiment mal tourné. Vous pouvez assez facilement écrire octet par octet en l'utilisant. Par exemple, essayez de l'utiliser avec tr.
Chris Down

@ChrisDown: Permettez-moi de supprimer cette phrase pour éviter toute confusion. En fait, lorsque vous utilisez <>file, vous ouvrez un fichier pour la lecture et l'écriture, mais vous n'écrivez rien dans le fichier.
cuonglm

1
Je pense que le point que @ChrisDown essaie de faire est que <>cela ne tronque pas un fichier, mais remplace simplement ses octets existants par la nouvelle sortie. Si la nouvelle sortie est trop courte, vous aurez des restes de déchets à la fin du fichier. Mais si la nouvelle sortie est suffisamment longue, il n'y a aucun risque.
BallpointBen

8

La page d'accueil de moreutils elle- même documente un cas d'utilisation typique:

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

Ici, / etc / passwd est à la fois écrit et lu et modifié. Sans éponger stdin avant d'écrire, / etc / passwd peut être corrompu (car le fichier a changé pendant la lecture).


Et ce serait un bon exemple sur la page moreutils, si cela avait expliqué la façon dont vous l'avez fait :-)
Br.Bill
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.