awk

2012-02-29 8 views
6

इम, awk के साथ एक फ़ाइल में एक पंक्ति का एक प्रतिस्थापन बनाने की कोशिश कर उदाहरण के लिएawk

के साथ एक लाइन बदलने के इस बदलते:

e1 is (on) 

e2 is (off) 

रहे हैं:

e1 is (on) 

e2 is (on) 

उपयोग आदेश:

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba 

इस प्रतिस्थापन बनाता है लेकिन फ़ाइल खाली हो जाती है!

उत्तर

18

एक और जवाब है, एक अलग उपकरण (sed, और मैं (जगह में) ध्वज) का उपयोग कर

sed -i '/e2/ s/off/on/' ~/Documents/Prueba 
17

आपका अजीब सही है, हालांकि आप अपने मूल के समान फ़ाइल पर रीडायरेक्ट कर रहे हैं। इससे मूल फ़ाइल को पढ़ने से पहले अधिलेखित किया जा रहा है। आपको आउटपुट को एक अलग फ़ाइल में रीडायरेक्ट करने की आवश्यकता होगी।

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new 

यदि आवश्यक हो तो Prueba.new का नाम बदलें।

+2

+1। "मूल फ़ाइल [है] ओवरराइट * पर जोर * इससे पहले * इसे पढ़ा गया है" –

0

आप इनपुट फ़ाइल के समान फ़ाइल पर रीडायरेक्ट नहीं कर सकते हैं। एक और फ़ाइल नाम चुनो।

> आपको पहले स्थान पर खाली कर देगा।

2

तुम भी cat का उपयोग फ़ाइल को पढ़ने के लिए सबसे पहले, तो pipe उपयोग कर सकते हैं stdout के लिए पुनर्निर्देशित करने के लिए, तो stdin से awk साथ पढ़ें:

cat ~/Documents/Prueba | awk '/e2/{gsub(/off/, "on")};{print}' - > ~/Documents/Prueba 

मेरा मानना ​​है कि पानी का छींटा - वैकल्पिक है, जब से तुम केवल stdin पढ़ रहे हैं।

कुछ रोचक प्रलेखन: https://www.gnu.org/software/gawk/manual/html_node/Naming-Standard-Input.html

2

अन्य उत्तर से और सवाल "Why reading and writing the same file through I/O redirection results in an empty file in Unix?" में समझाया, खोल पुनर्निर्देशन अपने इनपुट फ़ाइल को नष्ट करने से पहले इसे पढ़ा जाता है।

स्पष्ट रूप से अस्थायी फ़ाइलों का उपयोग किए बिना उस समस्या को हल करने के लिए, moreutils संग्रह से sponge कमांड पर एक नज़र डालें।

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba 

वैकल्पिक रूप से, अगर जीएनयू awk आपके सिस्टम पर स्थापित किया गया है, तो आप in place extension उपयोग कर सकते हैं।

gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba 
संबंधित मुद्दे