यह उपयोग करना संभव है 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 का उपयोग करेंगे जिनमें वास्तव में उस पैटर्न से मेल खाती लाइनें हैं।