कई फ़ाइलों के भीतर पाठ ढूंढें और बदलें


84

मैं जानना चाहता हूं कि मैं लिंक किए गए ट्यूटोरियल में नोटपैड ++ जैसी कई फाइलों में किसी विशिष्ट पाठ को कैसे ढूंढ और बदल सकता हूं।

उदाहरण: http://cybernetnews.com/find-replace-multiple-files/


इसमें ग्राफिकल इंटरफ़ेस नहीं होगा लेकिन मैं आपसे sed (मैन sed) की जाँच करने का आग्रह करूँगा। यह स्ट्रीम संपादक है जो UNIX की शुरुआत से अस्तित्व में है।
अपोलिंस्की 14

जवाबों:


136

यहाँ मैं "साइबरनेट" शब्द की हर घटना को "साइबरनेट" के साथ हर फाइल को एक्सटेंशन, सी, डायरेक्टरी, / होम / यूजर / डायरेक्टरी / में बदलने के लिए sed का उपयोग करता हूँ।

find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

एक अधिक सामान्य भिन्नता जहाँ आप निष्पादन की निर्देशिका से पुनरावर्ती खोज करते हैं और केवल नियमित, पठनीय, लिखने योग्य फ़ाइलों पर काम करते हैं:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;

2
इसके लिए वोट किया गया क्योंकि यह एक ऐसी कारगर विधि है
सबकोन

4
वोट दिया गया क्योंकि sed सबसे अच्छा विकल्प IMO है, लेकिन उत्तर अधिक उपयोगी होगा यदि आपने उत्तर के घटकों को समझाया (व्यक्तिगत रूप से, मैं {} \
_ के

5
Ifteroiamcdowell वू! मुझसे यह छूट गया! माफ़ करना। ब्रेसिज़ का अर्थ मूल रूप से "प्रत्येक मैच के लिए" और बची हुई अर्ध-बृहदान्त्र (\;) दोहरी पार्सिंग को रोकना है। हम बॉर्न-संगत शेल और sed को कमांड को पार्स करने की कोशिश नहीं करना चाहते हैं, बस sed।

@ अगर यह शब्द रिक्त स्थान की तरह है तो यह कैसे काम करता है cyber net news? मैं इसे कैसे बदल सकता हूं cyber net?
खुर्शीद आलम

1
@ कुर्शीदअम -E स्विच के साथ वर्ण वर्ग का प्रयोग करें:sed -i -e "s/cyber\snet\snews/cyber net/g"

27

धारा संपादक, sed, इस तरह के काम के लिए एक शक्तिशाली उपयोगिता है और मेरी पहली पसंद है, हालांकि, यदि आप उबंटू आधारित मूल एप्लिकेशन का उपयोग करके एक साधारण पाठ संपादक से ऐसा करना चाहते हैं, तो मेरा सुझाव है कि आप जेडिट पर एक नज़र डालें , यह रिपॉजिटरी में उपलब्ध है और इसे आपके कंसोल में टाइप करके इंस्टॉल किया जा सकता है:

sudo apt-get install jedit

Jedit शुरू करें, मेनू सूची में खोज मेनू आइटम पर क्लिक करें, निर्देशिका आइटम में खोजें पर क्लिक करें, आपको नीचे दिए गए संवाद के साथ प्रस्तुत किया जाएगा:

Jedit सर्च इन फोल्डर डायलॉग

यह नोटपैड ++ के समान है और वही काम करता है, मेरा मानना ​​है कि यह वही है जो आप चाहते हैं।


जब मैं कोड की एक पूरी लाइन की खोज कर रहा था, तो यह एकदम सही था, और अगर मैं उसी के साथ एक ही विशेष चरित्र से बचने में संकोच करता sed
IQAndreas सेप

आप सेकंड में कोड ब्लॉक (जैसे html, जावास्क्रिप्ट, आदि) को बदल सकते हैं।
लेप

यह बड़ी संख्या में फाइलों पर काम नहीं करता है, कुछ घंटों के बाद इसने एक प्रतिस्थापन नहीं किया था, जबकि गनी ने सभी घटनाओं को खोजने में कुछ मिनट का समय लिया। यह एक कुशल खोज और जगह नहीं हो सकती है लेकिन इसने कमरे को अच्छी तरह से गर्म कर दिया है।
मार्क अरोनी

19

एक और जीयूआई विकल्प regexxer है : regexxer स्क्रीनशॉट


पूरी तरह से काम करता है (यदि आप पहले से ही रेगेक्स से परिचित हैं), धन्यवाद।
अर्नेस्ट

1
यहां तक ​​कि, यदि आप रेगेक्स को नहीं जानते हैं, तो आप इस टूल को एक साधारण स्ट्रिंग खोज और प्रतिस्थापित टूल के रूप में उपयोग कर सकते हैं और यह आपके लिए काम करेगा, रेगेक्स या किसी भी चीज की कोई आवश्यकता नहीं है।
मोहम्मद अब्दुल मुजीब

13
perl -pi -e 's/oldtext/newtext/g' *

वर्तमान फ़ोल्डर में सभी फ़ाइलों में newtext द्वारा पुराने की किसी भी घटना को प्रतिस्थापित करता है। हालाँकि आपको बैकस्लैश का उपयोग करके पुराने और नए संदर्भों के सभी विशेष लक्षणों से बचना होगा।


9

Geany के साथ जांचें , यह लिनक्स के लिए एकदम सही NPP प्रतिस्थापन है। आप वास्तव में ऐसा कर सकते हैं कि आप रेगेक्स का उपयोग कर सकते हैं।


मैं गीन प्यार करता हूँ! यह मेरा पसंदीदा संपादक है और काफी शक्तिशाली है।
पिस्सु

1
जहाँ तक मैं बता सकता हूँ, Geany 1.23.1 (Ubuntu 13.10 के साथ पैक) regex का उपयोग करके कई फ़ाइलों को खोजने की अनुमति देता है, लेकिन उनमें जगह नहीं।
आकर्षित नोकें

यदि आप उन सभी को खोलते हैं और फिर खोज / बदलें संवाद में "सत्र में" बटन का उपयोग कर आप गीनी की कई फाइलों को खोज और बदल सकते हैं।
एम.वी.

1
आप संदेश टैब में सूचीबद्ध 5000 फाइलें कैसे खोलते हैं?
मार्क आरोनी

1
ठीक है, द रेगेन्सर बहुत ज्यादा था जो मैं पूछ रहा था, मैंने इसे पहले ही छोड़ दिया था क्योंकि इसका नाम रेगेक्स था और मैं सिर्फ रेगेक्स के साथ कुछ भी करने से बचता हूं। लेकिन मैं गलत था, उस उपकरण को ठीक उसी तरह से खोज और बदलने के लिए आवश्यक है।
मोहम्मद अब्दुल मुजीब

3

मैंने सिर्फ इस चीज के लिए थोड़ी स्क्रिप्ट लिखी। यदि आपको केवल मूल बातें चाहिए और सेड आदि से परिचित नहीं हैं, तो यहां देखें: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in -एक-सेट-ऑफ-द फ़ाइलें /

स्क्रिप्ट निम्नलिखित है:

for f in submit_*;
  do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
  mv a_$f $f ;
done

2

आप इस स्क्रिप्ट का उपयोग कर सकते हैं, कोड की प्रतिलिपि बना सकते हैं और एक फ़ाइल बना सकते हैं find_and_replace_in_files.sh

मैंने इसे थोड़ा संशोधित किया है; कृपया मुझे अपनी राय बताएं।

# *****************************************************************************************
# find_and_replace_in_files.sh
# This script does a recursive, case sensitive directory search and replace of files
# To make a case insensitive search replace, use the -i switch in the grep call
# uses a startdirectory parameter so that you can run it outside of specified directory - else this script will modify itself!
# *****************************************************************************************

!/bin/bash
# **************** Change Variables Here ************
startdirectory="/your/start/directory"
searchterm="test"
replaceterm="test=ok!"
# **********************************************************

echo "***************************************************"
echo "* Search and Replace in Files Version 01-Aug-2012 *"
echo "***************************************************"

i=0; 

  for file in $(grep -l -R $searchterm $startdirectory)
    do
      cp $file $file.bak
      sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
      mv tempfile.tmp $file

    let i++;

      echo "Modified: " $file
    done

echo " *** All Done! *** Modified files:" $i

2

एक अन्य कार्यक्रम Searchmonkey है

SearchMonkey एक लाइट-वेट Gtk एप्लिकेशन है जिसका उद्देश्य बोझिल खोज / grep को एक स्लीक यूजर इंटरफेस के साथ बदलना है जो जल्दी से मार्क-अप दिखाने के स्थान और टेक्स्ट मैचों की मात्रा प्रदान करता है। लक्ष्य अंत उपयोगकर्ताओं के लिए एक सरल उपयोग और सुलभ उपकरण प्रदान करना है, और सॉफ्टवेयर डेवलपर्स समान है।


2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

फेडोरा पर मेरे लिए काम करता है


आप यह बताकर एक पंक्ति जोड़ सकते हैं कि यह Askubuntu.com/a/84013/158442
muru

@ एमरू यह बहुत कम sedउदाहरण चलाता है ! तो यह CPU समय के मामले में बहुत तेज है। क्योंकि फ़ाइल का उपयोग समय सीमित होगा, मुझे लगता है कि यह घड़ी के समय में बहुत तेज़ नहीं है, लेकिन कम सिस्टम लोड देता है। नोट xargsबहुत से डाल देगा, जैसे hundereds, एक sedकमांड के कमांडलाइन पर फ़ाइल नाम का - पथों की लंबाई के आधार पर उपलब्ध बफर आकार को भरना।
वोल्कर सीगल

हम्म ... अगर यह बंद हो जाता है, तो मैं इसे एक स्पष्ट रूप से समझा सकता हूं कि यह एक उत्थान से बेहतर क्यों है।
वोल्कर सीगल

@VolkerSiegel उस के साथ प्राप्त किया जा सकता +बजाय \;में find, है ना?
मुरु

1
@ मौरू संभवतः ... मेरी "नौकरी के लिए कठोर उपकरण" - स्पष्ट रूप से पसंद करता है xargs, लेकिन आप सही हैं; से man find: -exec command {} +: ... The command line is built in much the same way that xargs...। मुझे git filter-branch... की कमांड लाइनों के बारे में सोचता है ;)
वोल्कर सेगेल

2

एक बहुत ही सरल समाधान: *.txtफ़ोल्डर में सभी फ़ाइलों को इसके string_1साथ बदलें string_2:

sed -i 's/string_1/string_2/g' *.txt

बहुत बढ़िया जवाब! बस कुछ जोड़। यदि आप वर्तमान निर्देशिका की किसी भी फ़ाइल में एक स्ट्रिंग को पुनरावर्ती रूप से बदलना चाहते हैं, तो यह प्रयास करें:sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
ड्रगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.