यह उपयोग करना संभव है gawk
के -i inplace
विकल्प और भी चीजों को प्रिंट stdout
?
उदाहरण के लिए, यदि मैं किसी फ़ाइल को अद्यतन करना चाहता था, और यदि कोई परिवर्तन हो तो फ़ाइल का नाम और मेरे द्वारा बदली गई पंक्तियों को प्रिंट stderr
कर सकते हैं।
find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
लेकिन क्या stdout
इसके बजाय उपयोग करने का एक तरीका है , या उस ब्लॉक को वैकल्पिक स्ट्रीम में प्रिंट करने के लिए एक क्लीनर तरीका है?
grep
हो सकता है। मेरी पहली वृत्ति फ़ाइल को दो बार "प्रोसेस" करने से बचने के लिए है, लेकिन मुझे बिल्कुल आश्चर्य नहीं होगा अगर यह वास्तव में तेज है। यह सिर्फ यह दिखाने के लिए जाता है कि मैं प्रोफाइलिंग कार्यों पर अपनी आंत पर भरोसा क्यों कर सकता हूं
-print -exec gawk
अब निष्पादित नहीं किया गया है) और 2) यह 1 मैच पर रुक जाएगा, जब तक कि 1 मैच न हो अंतिम पंक्ति आप अभी भी पूरी फ़ाइल को दो बार संसाधित नहीं कर रहे हैं (यह 1.X बार की तरह अधिक है)। इसके अलावा, अगर यह gawk -i inplace
काम करता है तो sed -i
यह फाइल को इन-प्लेस पर एडिट करेगा - यानी टाइमस्टैम्प, इनकोड आदि को अपडेट करने पर भी, अगर एडिट करने के लिए कुछ नहीं था ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
कि आप केवल उन फ़ाइलों को संपादित करने के लिए awk का उपयोग करेंगे जिनमें वास्तव में उस पैटर्न से मेल खाती लाइनें हैं।