स्पंज अधिक स्पंज से - शेल पुनर्निर्देशित करने के लिए क्या अंतर है? उपयोगी उदाहरण?


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   

स्पंज मानक इनपुट पढ़ता है और इसे निर्दिष्ट फ़ाइल पर लिखता है। शेल पुनर्निर्देशित के विपरीत, स्पंज आउटपुट फाइल लिखने से पहले अपने सभी इनपुट को भिगो देता है। यह उन पाइपलाइनों का निर्माण करने की अनुमति देता है जो उसी फ़ाइल से पढ़ते हैं और लिखते हैं।

मुझे समझ नहीं आ रहा है। कृपया मुझे कुछ उपयोगी उदाहरण दें।

भिगोने का क्या मतलब है?



एक और उदाहरण है expand foo.txt | sponge foo.txt। इन्हें भी देखें: stackoverflow.com/a/33639324/1959808
Ioannis Filippidis

tl; डॉ। आउटपुट फ़ाइल को रौंदने से पहलेsponge इसके इनपुट को "सोख लेता है"
BallpointBen

जवाबों:


34

मान लें कि नाम की एक फ़ाइल है input, तो आप के साथ सभी लाइन शुरू निकालना चाहते हैं #में input। आप सभी पंक्तियों #का उपयोग करके शुरू नहीं कर सकते हैं:

grep -v '^#' input

लेकिन आप किस तरह से बदलाव करते हैं input? मानक POSIX टूलकिट के साथ, आपको एक अस्थायी फ़ाइल का उपयोग करने की आवश्यकता है, कुछ चीज़ जैसे:

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

शेल पुनर्निर्देशन के साथ:

grep -v '^#' input >input

काटना होगा inputआप इसे से पढ़ने से पहले।

के साथ sponge, आप कर सकते हैं:

grep -v '^#' input | sponge input

5
आप वास्तव में एक फ़ाइल को उसी समय सुरक्षित रूप से पढ़ और लिख सकते हैं जब तक कि <>ऑपरेटर को इस्तेमाल करके बाइट्स को केवल रूपांतरित किया जा रहा हो ।
क्रिस डाउन

@ क्रिसडाउन: हाँ, मेरा मतलब है कि इसे प्रफुल्लित किए बिना
cuonglm

मुझे यकीन नहीं है कि आप "इसे भ्रष्ट बनाने" के बारे में क्या कहते हैं। इसके विपरीत >और <, <>फ़ाइल को तब तक दूषित नहीं करता जब तक कि कुछ गलत नहीं हुआ। आप इसे आसानी से बाइट लिखकर बाइट लिख सकते हैं। उदाहरण के लिए, इसके साथ प्रयोग करके देखें tr
क्रिस डाउन

1
@ क्रिसडाउन: मुझे भ्रमित करने से बचने के लिए उस वाक्य को हटा दें। मैं वास्तव में मतलब है जब <>fileआप उपयोग करते हैं , तो आप पढ़ने और लिखने के लिए फ़ाइल खोलते हैं लेकिन आप वास्तव में फाइल करने के लिए कुछ भी नहीं लिखते हैं।
congonglm

2
मुझे लगता है कि @ChrisDown बनाने की कोशिश कर रही बात यह है कि <>यह किसी फ़ाइल को काटती नहीं है, लेकिन इसके मौजूदा बाइट्स को नए आउटपुट के साथ बदल देती है। यदि नया आउटपुट बहुत छोटा है, तो आपके पास फ़ाइल के अंत में बचे हुए कचरे होंगे। लेकिन अगर नया आउटपुट काफी लंबा है, तो कोई जोखिम नहीं है।
BallpointBen

9

Moreutils मुख पृष्ठ अपने आप में एक विशिष्ट उपयोग के मामले दस्तावेजों:

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

यहाँ, / etc / passwd दोनों को लिखा और पढ़ा जा रहा है, और संशोधित किया जा रहा है। लिखने से पहले स्टड अप स्पॉन्ज किए बिना, / etc / passwd को दूषित किया जा सकता है (जैसा कि फ़ाइल पढ़ने के दौरान बदल गया)।


और यह एक अच्छा उदाहरण होगा पेजयल पेज पर, अगर इसने आपके द्वारा किए गए तरीके को समझाया हो :-)
Br.Bill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.