Temukan dan ganti teks dalam banyak file

84

Saya ingin tahu bagaimana saya bisa menemukan dan mengganti teks tertentu dalam banyak file seperti di Notepad ++ di tutorial yang ditautkan.

misalnya: http://cybernetnews.com/find-replace-multiple-files/

Faruk Uzun
sumber
Itu tidak akan memiliki antarmuka grafis tetapi saya akan mendorong Anda untuk memeriksa sed (man sed). Ini adalah editor aliran yang telah ada sejak awal UNIX.
apolinsky

Jawaban:

136

Di sini saya menggunakan sed untuk mengganti setiap kemunculan kata "cybernetnews" dengan "cybernet" di setiap file dengan ekstensi, c, dalam direktori, / home / user / direktori /.

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

Variasi yang lebih umum di mana Anda mencari secara rekursif dari direktori eksekusi dan hanya beroperasi pada file biasa, dapat dibaca, dan dapat ditulis:

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;
gregtczap
sumber
2
Memilih ini karena ini adalah metode yang efisien
Sabacon
4
Terpilih karena sed adalah IMO pilihan terbaik, tetapi jawabannya akan lebih berguna jika Anda menjelaskan komponen-komponen jawaban (secara pribadi, saya tidak terbiasa dengan dan ingin tahu tentang {} \;)
sequoia mcdowell
5
@afteroiamcdowell Woo! Saya melewatkan ini! Maaf. Kurung berarti pada dasarnya "untuk setiap pertandingan" dan semi-colon yang lolos (\;) adalah untuk mencegah penguraian ganda. Kami tidak ingin shell yang kompatibel dengan bourne dan sed mencoba untuk menguraikan perintah, hanya sed.
@ Chrisopher bagaimana cara kerjanya jika kata berisi spasi suka cyber net news? Bagaimana saya bisa mengonversi ini menjadi cyber net?
Khurshid Alam
1
@KhurshidAlam Gunakan kelas karakter dengan tombol -e:sed -i -e "s/cyber\snet\snews/cyber net/g"
27

Editor aliran, sed, adalah utilitas yang kuat untuk jenis pekerjaan ini dan merupakan pilihan pertama saya, namun, jika Anda ingin melakukan ini dari editor teks biasa menggunakan aplikasi asli berbasis Ubuntu, saya sarankan Anda melihat Jedit , Ini tersedia di repositori dan dapat diinstal dengan mengetikkan konsol Anda:

sudo apt-get install jedit

Mulai jedit, klik item menu pencarian, di daftar menu, klik item Search in Directory, Anda akan disajikan dialog di bawah ini:

Jedit Cari Di Folder Dialog

Ini mirip dengan Notepad ++ dan melakukan hal yang sama, saya percaya ini yang Anda inginkan.

Sabacon
sumber
Ini sempurna ketika saya sedang mencari seluruh baris kode, dan ragu untuk melarikan diri setiap karakter khusus regex jika saya melakukan hal yang sama dengannya sed.
IQAndreas
Anda dapat mengganti blok kode (seperti html, javascript, dll) dalam hitungan detik.
lepe
Ini tidak berfungsi pada sejumlah besar file, setelah beberapa jam tidak membuat satu pengganti, sedangkan geany membutuhkan beberapa menit untuk menemukan semua kemunculannya. Ini mungkin bukan pencarian dan penggantian yang efisien tetapi ini menghangatkan ruangan dengan baik.
Mark Aroni
19

Opsi GUI lainnya adalah regexxer : tangkapan layar regexxer

int_ua
sumber
Berfungsi sempurna (jika Anda sudah terbiasa dengan Regex), terima kasih.
Ernest
1
Bahkan, jika Anda tidak tahu regex, Anda dapat menggunakan alat ini sebagai alat pencarian dan penggantian string sederhana dan itu akan melakukan pekerjaan untuk Anda, tidak perlu untuk regex atau apa pun.
Mohd Abdul Mujib
13
perl -pi -e 's/oldtext/newtext/g' *

mengganti semua kejadian oldtext dengan newtext di semua file di folder saat ini. Namun Anda harus melarikan diri dari semua karakter khusus perl dalam oldtext dan newtext menggunakan backslash.

Michael K.
sumber
9

Periksa dengan Geany , itu adalah pengganti NPP yang sempurna untuk Linux. Anda dapat melakukan hal itu plus Anda dapat menggunakan regex.

Stefano Mtangoo
sumber
Saya suka Geany! Ini editor favorit saya dan cukup kuat.
Pisu
1
Sejauh yang saya tahu, Geany 1.23.1 (dikemas dengan Ubuntu 13.10) memungkinkan pencarian beberapa file menggunakan regex, tetapi tidak menggantikannya.
Drew Noakes
Anda dapat mencari dan mengganti dalam banyak file Geany jika Anda membuka semuanya dan kemudian menggunakan tombol "dalam sesi" dalam dialog Pencarian / Ganti.
MV.
1
Bagaimana Anda membuka 5000 file yang terdaftar di tab pesan?
Mark Aroni
1
Ok, Regexxer cukup banyak apa yang saya minta, saya baru saja melewatkannya sebelumnya karena namanya memiliki regex dan saya cenderung menghindari apa pun yang berkaitan dengan regex. Tapi saya salah, dan alat itu memiliki persis apa yang diperlukan untuk pencarian dan penggantian.
Mohd Abdul Mujib
2

Anda dapat menggunakan skrip ini, menyalin kode, dan membuat file find_and_replace_in_files.sh.

Saya telah memodifikasinya sedikit; tolong katakan pendapatmu.

# *****************************************************************************************
# 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
dimitrios
sumber
2

Program lain adalah Searchmonkey .

SearchMonkey adalah aplikasi Gtk ringan yang bertujuan untuk menggantikan find / grep yang rumit dengan antarmuka pengguna yang apik yang dengan cepat menyediakan mark-up yang menunjukkan lokasi dan jumlah kecocokan teks. Tujuannya adalah untuk menyediakan alat pencarian yang mudah digunakan dan diakses oleh pengguna akhir, dan juga pengembang perangkat lunak.

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

bekerja untuk saya di fedora

pengguna328359
sumber
Anda bisa menambahkan baris yang menjelaskan bagaimana ini meningkat melalui askubuntu.com/a/84013/158442
muru
@muru Ini menjalankan sedinstance jauh lebih sedikit ! Jadi ini jauh lebih cepat dalam hal waktu CPU. Karena waktu akses file akan terbatas, saya pikir itu tidak jauh lebih cepat dalam waktu jam, tetapi memberikan beban sistem yang lebih rendah. Catatan xargsakan menempatkan banyak, seperti hundered, nama file pada baris perintah dari satu sedperintah - mengisi ukuran buffer yang tersedia berdasarkan panjang lintasan.
Volker Siegel
Hmm ... jika ini ditutup, saya bisa menggantinya dengan yang jelas menjelaskan mengapa ini lebih baik daripada yang terunggul.
Volker Siegel
@ VolkerSiegel yang bisa dicapai dengan +bukan \;di find, kan?
muru
1
@muru Mungkin ... "Alat rigth untuk pekerjaan" saya - insting jelas lebih suka xargs, tapi Anda benar; dari man find: -exec command {} +: ... The command line is built in much the same way that xargs.... Buat saya berpikir tentang baris perintah git filter-branch...;)
Volker Siegel
2

Solusi yang sangat sederhana: ganti semua *.txtfile di folder string_1dengan string_2:

sed -i 's/string_1/string_2/g' *.txt
Helmut P.
sumber
Jawaban bagus! Hanya tambahan saja. Jika Anda ingin mengganti string dalam file apa pun dari direktori saat ini secara rekursif maka coba ini:sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
drugan