grep: इनपुट फ़ाइल 'X' भी आउटपुट है


12

मैं किसी फ़ाइल ubuntu 14.4में grepकमांड के आउटपुट को रीडायरेक्ट करने का प्रयास करता हूं, लेकिन मुझे यह त्रुटि मिलती रहती है:

grep: input file 'X' is also the output

मैंने इस मुद्दे को खोजा है और अभी पता चला है कि यह एक बग था ubuntu 12.4और इसमें कोई वर्णन नहीं है, क्या कोई मुझे इस समस्या का पता लगाने में मदद कर सकता है?

मैं निम्नलिखित कमांड चलाता हूं:

grep -E -r -o -n r"%}(.*){%" > myfile

यदि आप कोशिश कर रहे हैं grep pattern file > fileतो यह काम नहीं करता है। आप grep के इनपुट और आउटपुट के समान फ़ाइल का उपयोग नहीं कर सकते।
जिमीज

मैं अपनी आज्ञा जोड़ता हूँ! संकेत के लिए धन्यवाद, लेकिन जब मैं किसी अन्य पथ में एक फ़ाइल का उपयोग करने की कोशिश करता है, तो यह भविष्यवाणी नहीं करता है और मैं ऐसा नहीं कर सकता!
कासरमवद

उदाहरण के लिए ../fi इसे प्राप्त करेंbash: ../f.txt: Permission denied
कास्रामव्ड

पूर्ण कमांड दिखाएं, आपकी इनपुट फ़ाइल क्या है, या आप पाइप का उपयोग कर रहे हैं?
जिमीज

1
अब मुझे समझ में आया कि आप वास्तव में पूरी तरह से पूरी तरह से डायरेक्टरी स्ट्रक्चर को तैयार कर रहे हैं और रिजल्ट को उस फाइल में जोड़ना चाहते हैं जो इस स्ट्रक्चर में पहले से मौजूद है। समस्या यह है कि शेल (बैश, zsh, जो भी हो) पहले पुनर्निर्देश करता है और उसके बाद ही वापस कमांड (इस उदाहरण में grep) जाता है। इसका मतलब है कि grepकमांड में grep pattern file > fileपहले से ही खाली फ़ाइल दिखाई देती है, इसलिए इनपुट के रूप में कुछ भी नहीं है। हालाँकि यदि आप >>इसके बजाय उपयोग करते हैं >तो फ़ाइल खाली नहीं है, लेकिन grep किसी भी तरह से त्रुटि को फेंक देता है क्योंकि यह एक ही पंक्ति (पैटर्न) को बार-बार पुन: संसाधित करने का कारण बन सकता है।
जिमीज

जवाबों:


9

इनपुट और आउटपुट के लिए समान फ़ाइल का उपयोग करना संभव नहीं है grep। आप निम्नलिखित विकल्पों पर विचार कर सकते हैं:

  • अस्थायी फ़ाइल

    grep pattern file > tmp_file
    mv tmp_file file
    
  • sed

    sed -i -n '/pattern/p' file
  • पूरी फ़ाइल को चर में रखें (बड़ी फ़ाइलों के लिए उज्ज्वल विचार नहीं)

    x=$(cat file); echo "$x" | grep pattern > file

1
सेड अधिक पोर्टेबल हो सकता हैsed -i '/pattern/!d' file
कोस्टास

लेकिन मामले में ओपी चाहता हैsed -i -n 's/.*\(pattern\).*/\1/p' file
कोस्टा

@ कोस्टस आप सही हैं, प्रश्न संपादित किया गया था और अतिरिक्त जानकारी जोड़ी गई है ताकि एक sedवाक्यविन्यास को भी पॉलिश किया जा सके ।
जिमीज

5

आप --excludeअपनी grepकमांड में फ़ील्ड का उपयोग इस तरह कर सकते हैं:

grep  --exclude=myfile  -Eron  r"%}(.*){%"  >  myfile

2
सुनिश्चित करें कि myfileयह अद्वितीय है क्योंकि यह केवल फ़ाइल के बेसनेम पर लागू होता है। आप अन्य निर्देशिकाओं में समान नाम वाली फ़ाइलों को छोड़ना नहीं चाहते हैं।
वाल्फ

1

मुझे बैश में एक रास्ता मिला: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

कमांड को <<<"..."पहले निष्पादित किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.