Birden çok dosya içindeki metni bul ve değiştir

73

Bağlantılı eğiticide Notepad ++ gibi birden fazla dosyadaki belirli bir metni nasıl bulabileceğimi ve değiştirebileceğimi bilmek istiyorum.

ör.: İşte

    
sordu Faruk Uzun 30.11.2011 14:58

10 cevap

124

Burada, "cybernetnews" kelimesinin "Cybernet" kelimesi ile her dosyanın yerine geçen her dosyadaki uzantıyı, c dizininde, / home / user / directory /.

ile değiştirmek için sed kullanıyorum.
find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

Yürütme dizininden yinelemeli olarak arama yaptığınız ve yalnızca düzenli, okunabilir, yazılabilir dosyalar üzerinde çalıştığınız daha genel bir varyasyon:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
    
verilen cevap user8290 30.11.2011 15:15
26

Akış düzenleyicisi, sed, bu tür işler için güçlü bir yardımcı programdır ve ilk tercihimdir, ancak bunu Ubuntu tabanlı bir yerel uygulama kullanarak sıradan bir metin düzenleyicisinden yapmak istiyorsanız, bir Jedit'e bakın, Depolarda bulunur ve konsolunuza yazarak kurulabilir:

sudo apt-get install jedit

Jedit'i başlatın, arama menü öğesini tıklayın, menü listesinden Dizin Ara'yı tıklayın, aşağıdaki iletişim kutusuyla birlikte sunulacaksınız:

Bu, Not Defteri + + 'nınkine benzer ve aynı şeyi yapar, inanıyorum, istediğin bu.

    
verilen cevap Sabacon 30.11.2011 16:57
17

Başka bir GUI seçeneği regexxer :

    
verilen cevap int_ua 30.11.2011 18:26
13
perl -pi -e 's/oldtext/newtext/g' *

geçerli klasördeki tüm dosyalarda newtext ile oldtext dosyasının varlığını değiştirir. Ancak, eski metin içinde tüm perl özel karakterlerinden ve ters eğik çizgi kullanarak yeni metinlerden kaçmak zorunda kalacaksınız.

    
verilen cevap Michael K 30.11.2011 15:11
9

Geany ile kontrol edin, Linux için mükemmel bir NPP değişimi. Tam olarak bunu yapabilirsin ve regex'i kullanabilirsin.

    
verilen cevap Stefano Mtangoo 30.11.2011 15:35
3

Sadece bu şey için küçük bir senaryo yazdım. Sadece temel bilgilere ihtiyacınız varsa ve sed vb. Hakkında bilgi sahibi değilseniz, buraya bir göz atın: İşte

Komut dosyası şudur:

for f in submit_*;
  do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
  mv a_$f $f ;
done
    
verilen cevap recluze 02.12.2011 03:09
2

Bu komut dosyasını kullanabilir, kodu kopyalayabilir ve find_and_replace_in_files.sh dosya oluşturabilirsiniz.

Biraz değiştirdim; lütfen fikrinizi söyleyin.

# *****************************************************************************************
# 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
    
verilen cevap dimitrios 01.08.2012 17:36
2

Başka bir program Searchmonkey .

  

SearchMonkey, hantal buluntu / grep'i hızlı bir şekilde işaretleme konumları ve metin eşleşmelerinin sayısını gösteren bir kaygan kullanıcı arabirimiyle değiştirmeyi amaçlayan hafif bir Gtk uygulamasıdır. Amaç, son kullanıcılar ve yazılım geliştiricileri için basit ve kullanımı kolay bir arama aracı sağlamaktır.

    
verilen cevap vrcmr 14.09.2012 23:44
2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

fedora için çalışıyor

    
verilen cevap user328359 19.09.2014 02:22
2

Çok basit bir çözüm: *.txt klasöründeki string_1 dosyasının string_2 klasörüyle değiştir:

sed -i 's/string_1/string_2/g' *.txt
    
verilen cevap Helmut P. 25.04.2015 13:01

Etiketlerdeki diğer soruları oku