Birden fazla dosyadaki metni bulun ve değiştirin


84

Bağlantılı öğreticideki Notepad ++ gibi birden çok dosyada belirli bir metni nasıl bulabileceğimi ve değiştirebileceğimi bilmek istiyorum.

örneğin: http://cybernetnews.com/find-replace-multiple-files/


Grafiksel bir arayüze sahip olmayacak, ancak ben sizden sed (man sed) 'i incelemenizi tavsiye ederim. UNIX'in başından beri varolan akış editörüdür.
apolinsky

Yanıtlar:


136

Burada, "cybernetnews" kelimesinin her cümlesini "cybernet" ile değiştirmek, her dosyada, c, / home / user / directory / dizinindeki c.

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

Tekrar tekrar yürütme dizininden aradığınız ve yalnızca normal, okunabilir, yazılabilir dosyalarda çalıştırdığınız daha genel bir varyasyon:

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

2
Bunun için oy kullandı, çünkü böyle etkili bir yöntem
Sabacon

4
; Sed iyi seçim IMO, ama cevap bileşenlerini açıklarsan cevap daha yararlı olacağından kadar Oy (şahsen {} \ yaklaşık aşina ve meraklı değilim)
sekoya mcdowell

5
@sequoiamcdowell Woo! Bunu özledim! Üzgünüm. Parantezler temel olarak "her bir eşleşme için" anlamına gelir ve kaçan yarı kolon (\;) çift ayrıştırmayı önler. Bourne uyumlu bir kabuk istemiyoruz ve yalnızca komutu sed komutunu çözümlemeye çalışıyorum.

@Christopher kelimesi gibi boşluklar içeriyorsa nasıl çalışır cyber net news? Bunu nasıl dönüştürebilirim cyber net?
Khurshid Alam,

1
-E anahtarı ile karakter sınıfını kullanın @KhurshidAlam:sed -i -e "s/cyber\snet\snews/cyber net/g"

27

Akış editörü sed, bu tür bir çalışma 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üzenleyiciden yapmak istiyorsanız, Jedit'e bir göz atmanızı öneririm , Depolarda bulunur ve konsolunuza yazarak kurulabilir:

sudo apt-get install jedit

Jedit'i başlatın, arama menüsü öğesini tıklayın, menü listesinde, Dizinde Ara öğesini tıklayın, aşağıdaki iletişim kutusuyla karşılaşacaksınız:

Klasör İletişiminde Jedit Araması

Bu, Notepad ++ 'ınkine benzer ve aynı şeyi yapar, istediğiniz şeyin bu olduğuna inanıyorum.


Bu, tüm bir kod satırını ararken mükemmeldi ve aynı şeyi yapmış olsaydım, her bir regex özel karakterinden kaçmakta tereddütlüydüm sed.
IQAndreas

Kod bloklarını (html, javascript, etc gibi) saniyeler içinde değiştirebilirsiniz.
lepe

Bu çok sayıda dosya üzerinde çalışmaz, birkaç saat sonra bir değişiklik yapmadı, ancak geany'nin tüm olayları bulması birkaç dakika sürdü. Bu verimli bir arama ve değiştirme olmayabilir, ancak odayı güzelce ısıtır.
Mark Aroni

19

Başka bir GUI seçeneği regexxer : regexxer ekran görüntüsü


Mükemmel çalışıyor (eğer zaten Regex'e aşinaysanız), teşekkür ederim.
Ernest

1
Hatta, regex'i tanımıyorsanız, bu aracı basit bir dize araması ve değiştirme aracı olarak kullanabilirsiniz; bu işlemi sizin için yapar, regex uygulamasına gerek yoktur.
Mohd Abdul Mujib

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

Geçerli klasördeki tüm dosyalarda, oldtext oluşumunu newtext ile değiştirir. Ancak, ters eğik çizgiyi kullanarak oldtext ve newtext içindeki tüm perl özel karakterlerinden kurtulmanız gerekir.


9

Geany ile kontrol edin , Linux için mükemmel bir NPP yerine geçer. Bunu tam olarak yapabilir, artı regex kullanabilirsiniz.


Geany'i seviyorum! Bu benim favori editörüm ve yeterince güçlü.
Pisu

1
Söyleyebileceğim kadarıyla, Geany 1.23.1 (Ubuntu 13.10 ile paketlenmiştir), regex kullanarak birden fazla dosya aramanıza izin verir, ancak bunların yerine geçmez.
Drew No

Hepsini açıp sonra Ara / Değiştir iletişim kutusundaki "oturumda" düğmesini kullanarak Geany'de birden fazla dosyayı arayabilir ve değiştirebilirsiniz.
MV.

1
Mesajlar sekmesinde listelenen 5000 dosyayı nasıl açabilirsiniz?
Mark Aroni

1
Tamam, regexxer istediğimden çok daha fazlasıydı, regex olan adı nedeniyle daha önce atlamıştım ve regex ile herhangi bir şeyden kaçınmaya meyilliyim. Ama yanılmışım, ve bu araç tam olarak arama ve değiştirme için gerekenlere sahip.
Mohd Abdul Mujib,


2

Bu betiği kullanabilir, kodu kopyalayabilir ve bir dosya oluşturabilirsiniz find_and_replace_in_files.sh.

Onu biraz değiştirdim; Lütfen bana fikrini söyle.

# *****************************************************************************************
# 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

Başka bir program Searchmonkey .

SearchMonkey, hantal bul / grep'in yerini, metin eşleşmelerini ve konumlarını gösteren hızlı bir şekilde işaretleme sağlayan kaygan bir kullanıcı arayüzü ile değiştirmeyi amaçlayan hafif bir Gtk uygulamasıdır. Amaç, son kullanıcılar ve yazılım geliştiriciler için kullanımı kolay ve erişilebilir bir arama aracı sağlamaktır.


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

fedorada benim için çalışıyor


Bunun nasıl geliştirildiğini açıklayan bir satırda askubuntu.com/a/84013/158442
muru

@muru Çok daha az sedörnek çalıştırır ! Bu yüzden CPU zamanı açısından çok daha hızlı. Dosyaya erişim süresi sınırlı olacağından, saatin süresinde daha hızlı olmadığını, daha düşük sistem yükü sağladığını düşünüyorum. Not xargs, tek bir sedkomutun komut satırına dosya adları gibi birçok dosya koyacaktır - mevcut tampon boyutunu yolların uzunluğuna göre doldurun.
Volker Siegel

Hmm ... eğer bu kapanırsa, neden değiştirilenden daha iyi olduğunu açık bir şekilde açıklayan ile değiştirebilirim.
Volker Siegel

İle elde edilebilir @VolkerSiegel +yerine \;de findsağ?
muru

1
@muru Muhtemelen ... Benim "iş için sağlam araç", içgüdüsel olarak açıkça tercih ediyor xargs, ama haklısın; dan man find: -exec command {} +: ... The command line is built in much the same way that xargs.... Beni git filter-branch...;) komut satırları hakkında düşündürüyor
Volker Siegel

2

Çok basit bir çözüm: hepsi yerine *.txtklasöründeki dosyaları string_1ile string_2:

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

Mükemmel cevap! Sadece bazı ekler. Geçerli dizinin herhangi bir dosyasındaki bir dizgiyi sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
tekrarlı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.