सभी फ़ाइलों से पुनरावर्ती रूप से लाइनें ढूंढना और हटाना


14

मैं का उपयोग करके एक कीवर्ड की घटनाओं को बढ़ाने में कामयाब रहा हूँ

grep "KeyWord" . -r -n -i -I 

लेकिन, कीवॉर्ड की घटनाएँ बहुत बड़ी हैं। मैं सिर्फ उस शब्द वाली सभी लाइनों को हटाना चाहता हूं।

मैंने आसपास खोज की, सीड उपयोगिता की तरह लग रहा है। क्या कोई मुझे बता सकता है कि आदेश क्या करेगा?

धन्यवाद।

जवाबों:


25

GNU sed के साथ:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

OSX sed के साथ:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

पहले कमांड findसभी मानक फाइलों को ढूँढता है (निर्देशिका नहीं, या पाइप, या आदि), उन्हें अलग करके प्रिंट करता है \0(ताकि फ़ाइलनाम में रिक्त स्थान, नई सूची आदि हो सकते हैं)।

दूसरा कमांड xargsआउटपुट को पढ़ता है find, एक विभाजक के आधार पर एक सूची को पकड़ता है ( \0क्योंकि -0), sed -i [...]सूची से जोड़े गए मापदंडों के साथ आह्वान करता है ( sedयदि कई फाइलें हैं तो कई बार कहा जाएगा, क्योंकि मापदंडों की अधिकतम लंबाई सीमित है प्रत्येक आह्वान)।

sedयथा-स्थान आदेश संशोधित ( -i)।

जैसा कि /KeyWord/d, यह नियमित अभिव्यक्ति वाले लाइनों को हटा देगा KeyWord।

आपको sedसरल (सरल लेकिन असामान्य) सिंटैक्स को अच्छी तरह से समझना सीखना चाहिए , और यहां शामिल टूल के बारे में अधिक जानकारी के लिए उपयुक्त मैनपेज़ का उल्लेख करना चाहिए।


और जैसा कि मैं बढ़ावा देना चाहता हूं zsh, इसके विस्तारित ग्लब्स के साथ समाधान:

sed -i /KeyWord/d **/*(.)

कैसे के बारे में सिर्फ शब्द "कीवर्ड हटा रहा है।" और पूरी लाइन नहीं है?
— सुरेननिहालानी

s/KeyWord//g( KeyWord'' (खाली स्ट्रिंग) के विकल्प, gसभी के लिए (केवल प्रत्येक पंक्ति पर पहले नहीं)।
— पियरे कैरियर

1

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g वैश्विक खोज

  2. d हटाना

  3. x सहेजें और बंद करें


मुझे देने वाले OSX में find: illegal option -- t, . find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
— एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.