sünger moreutils - kabuk yönlendirmesi arasındaki fark nedir? faydalı örnekler?


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

sünger standart girdiyi okur ve belirtilen dosyaya yazar. Kabuk yönlendirmesinden farklı olarak, sünger çıktı dosyasını yazmadan önce tüm girdilerini emer. Bu, aynı dosyadan okunan ve aynı dosyaya yazılan boru hatlarının oluşturulmasına izin verir.

Anlamıyorum. Lütfen bana bazı faydalı örnekler verin.

Islanma ne demektir?



Başka bir örnek expand foo.txt | sponge foo.txt. Ayrıca bakınız: stackoverflow.com/a/33639324/1959808
Ioannis Filippidis

tl; dr çıktı dosyasını kesmeden öncesponge girdisini "emer"
BallpointBen

Yanıtlar:


34

Eğer adlı bir dosya olduğunu varsayalım input, sen içeren tüm satır başlangıç kaldırmak istediğiniz #yer input. Tüm satırların aşağıdakileri #kullanarak başlamamasını sağlayabilirsiniz :

grep -v '^#' input

Ama nasıl değişiklik yaparsınız input? Standart POSIX toolchest ile, geçici bir dosya kullanmanız gerekir, örneğin:

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

Kabuk yeniden yönlendirmesi ile:

grep -v '^#' input >input

inputondan okumadan önce kısalır .

İle spongeşunları yapabilirsiniz:

grep -v '^#' input | sponge input

5
<>İşleci kullanarak baytlar yalnızca dönüştürüldüğü sürece, aynı anda güvenle bir dosyayı okuyabilir ve yazabilirsiniz .
Chris Down

@ChrisDown: Evet, demek istediğim corroupt olmadan
cuonglm

"Onu bozmak" konusunda ne demek istediğinden emin değilim. Aksine >ve <, <>bozuk dosya değil bir şey gerçekten yanlış gitti sürece. Bayt baytını kullanarak kolayca yazabilirsiniz. Örneğin, ile kullanmayı deneyin tr.
Chris Down

1
@ChrisDown: Kafa karıştırmamak için o cümleyi kaldırmama izin verin. Demek istediğim, kullanırken <>file, okuma ve yazma için dosyayı açıyorsunuz ama aslında dosyaya bir şey yazmıyorsunuz.
cuonglm

2
@ChrisDown'ın yapmaya çalıştığı nokta, bir dosyayı kısaltmak <>değil, sadece mevcut baytlarını yeni çıktıyla değiştiriyor. Yeni çıktı çok kısaysa, dosyanın sonunda artık çöp olur. Ancak yeni çıktı yeterince uzunsa, risk yoktur.
BallpointBen

9

Moreutils ana sayfası kendisi tipik bir kullanım örneğini belgeler:

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

Burada, / etc / passwd yazılıyor ve okunuyor ve değiştiriliyor. Yazmadan önce stdin'i sersemletmeden / etc / passwd bozulabilir (dosya okuma sırasında değiştiğinden).


Ve bu şekilde yaptığınızı açıklasaydı moreutils sayfasında iyi bir örnek olurdu :-)
Br.Bill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.