গ্রেপ: ইনপুট ফাইল 'এক্স' আউটপুটও


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করে থাকেন তবে কাজ করে না। আপনি গ্রেপের জন্য ইনপুট এবং আউটপুট হিসাবে একই ফাইলটি ব্যবহার করতে পারবেন না।
জিম্মিজ

আমি আমার আদেশ যোগ! ইঙ্গিত দেওয়ার জন্য ধন্যবাদ, তবে যখন আমি অন্য পথে কোনও ফাইল ব্যবহার করার চেষ্টা করি তখন এটি পূর্বাভাস দেয় না এবং আমি তা করতে পারি না!
কাসরামভিডি

উদাহরণস্বরূপ ../fi সহ এটি পানbash: ../f.txt: Permission denied
কাসরামভিড

সম্পূর্ণ কমান্ড দেখান, আপনার ইনপুট ফাইলটি কী, বা আপনি পাইপটি ব্যবহার করছেন?
jimmij

1
এখন আমি বুঝতে পেরেছি যে আপনি প্রকৃতপক্ষে পুরো ডিরেক্টরি কাঠামোকে বারবার ছাঁটাই করছেন এবং ফলাফলটি ইতিমধ্যে এই কাঠামোতে বিদ্যমান ফাইলে যুক্ত করতে চান। সমস্যাটি হ'ল শেল (ব্যাশ, zsh, যাই হোক না কেন) প্রথমে পুনর্নির্দেশগুলি সম্পাদন করে এবং তারপরেই কমান্ডগুলিতে ফিরে যায় (এই উদাহরণে গ্রেপ)। এর অর্থ হ'ল grepকমান্ডটি grep pattern file > fileইতিমধ্যে খালি ফাইল দেখে, তাই ইনপুট হিসাবে কিছুই নেই। তবে এর >>পরিবর্তে আপনি যদি >ফাইলটি ব্যবহার করেন তবে ফাইলটি খালি নয়, তবে গ্রেপ ত্রুটি কোনওভাবেই ছুঁড়ে দেয় কারণ এটি একই লাইনের (প্যাটার্ন) বারবার পুনরাবৃত্তি করতে পারে।
জিম্মিজ

উত্তর:


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
কোস্টাস 21

তবে ক্ষেত্রে ওপি চায়sed -i -n 's/.*\(pattern\).*/\1/p' file
কস্টাস

@ কাস্টাস আপনি ঠিক বলেছেন, প্রশ্নটি সম্পাদিত হয়েছিল এবং অতিরিক্ত তথ্য যুক্ত করা হয়েছিল যাতে কেউ sedসিনট্যাক্সও পোলিশ করতে পারে ।
jimmij

5

আপনি --excludeআপনার grepকমান্ডের ক্ষেত্রটি এর মতো ব্যবহার করতে পারেন :

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

2
myfileএটি কেবল ফাইলের বেসনামের ক্ষেত্রে প্রযোজ্য তা নিশ্চিত হয়ে নিন unique আপনি অন্য ডিরেক্টরিতে একই নামে ফাইলগুলি এড়িয়ে যেতে চান না।
ওয়ালফ

1

বাশে আমি একটি উপায় পেয়েছি: cat >> IN_OUTPUT_FILE <<< "$(grep something IN_OUTPUT_FILE)"

কমান্ডটি <<<"..."প্রথমে কার্যকর করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.