Pertanyaan Temukan dan ganti teks dalam beberapa file


Saya ingin tahu bagaimana saya dapat menemukan dan mengganti teks tertentu dalam beberapa file seperti di Notepad ++ di tutorial yang terhubung.

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


73
2017-11-30 13:58


asal


Ini 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:


Di sini saya menggunakan sed untuk mengganti setiap kemunculan kata "cybernetnews" dengan "cybernet" di setiap file dengan ekstensi, c, di 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 ditulisi:

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

124
2017-11-30 14:15



Dipilih untuk ini karena itu adalah metode yang efisien - Sabacon
Dipilih karena sed adalah IMO pilihan terbaik, tetapi jawaban akan lebih berguna jika Anda menjelaskan komponen jawaban (secara pribadi, saya tidak akrab dengan dan ingin tahu tentang {} \;) - sequoia mcdowell
@sequoiamcdowell Woo! Saya melewatkan ini! Maaf. Tanda kurung pada dasarnya berarti "untuk setiap pertandingan" dan semi-kolon yang melarikan diri (\;) adalah untuk mencegah penguraian ganda. Kami tidak ingin shell yang kompatibel dengan bourne dan sed mencoba menguraikan perintah, cukup sed.
@Christopher bagaimana cara kerjanya jika kata tersebut mengandung spasi seperti cyber net news? Bagaimana saya bisa mengonversinya menjadi cyber net? - Khurshid Alam
@KhurshidAlam Gunakan kelas karakter dengan tombol -e: sed -i -e "s/cyber\snet\snews/cyber net/g"


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 mengetik di konsol Anda:

sudo apt-get install jedit

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

Jedit Search In Folder Dialog

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


26
2017-11-30 15:57



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


Pilihan GUI lainnya adalah regexxer: regexxer screenshot


17
2017-11-30 17:26



Bekerja dengan sempurna (jika Anda sudah akrab dengan Regex), terima kasih. - Ernest


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

menggantikan setiap kejadian oldtext oleh newtext di semua file dalam folder saat ini. Namun Anda harus melarikan diri semua karakter khusus perl dalam oldtext dan newtext menggunakan backslash.


13
2017-11-30 14:11





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


9
2017-11-30 14:35



Saya suka Geany! Ini editor favorit saya dan cukup kuat. - Pisu
Sejauh yang saya tahu, Geany 1.23.1 (dikemas dengan Ubuntu 13.10) memungkinkan mencari beberapa file menggunakan regex, tetapi tidak menggantikannya. - Drew Noakes
Anda dapat mencari dan mengganti dalam beberapa file Geany jika Anda membukanya semua dan kemudian menggunakan tombol "dalam sesi" di dialog Cari / Ganti. - MV.
Bagaimana Anda membuka 5000 file yang terdaftar di tab pesan? - Mark Aroni


Saya menulis skrip kecil untuk hal ini saja. Jika Anda hanya membutuhkan dasar-dasar dan tidak akrab dengan dll, silakan lihat di sini: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in-a-set-of-files/

Skripnya adalah sebagai berikut:

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

3
2017-12-02 02:09





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

Saya telah mengubahnya sedikit; tolong beri tahu pendapat Anda.

# *****************************************************************************************
# 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
2017-08-01 15:36





Program lain adalah Searchmonkey.

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


2
2017-09-14 21:44





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

bekerja untuk saya di fedora


2
2017-09-19 00:22



Anda dapat menambahkan baris yang menjelaskan bagaimana hal ini menjadi lebih baik askubuntu.com/a/84013/158442 - muru
@muru Ini berjalan jauh lebih sedikit sed contoh! Jadi jauh lebih cepat dalam hal waktu CPU. Karena waktu akses file akan membatasi, saya pikir itu tidak lebih cepat dalam waktu jam, tetapi memberikan beban sistem yang lebih rendah. Catatan xargs akan menempatkan banyak, seperti hundered, dari nama file pada commandline dari single sed perintah - mengisi ukuran buffer yang tersedia berdasarkan panjang jalurnya. - Volker Siegel
Hmm ... jika ini ditutup, saya bisa menggantinya dengan yang jelas menjelaskan mengapa itu lebih baik daripada yang terpilih. - Volker Siegel
@VolkerSiegel yang dapat dicapai dengan + dari pada \; di findbenar? - muru
@muru Mungkin ... My "alat rigth untuk pekerjaan" -caran jelas lebih suka xargs, tetapi Anda benar; dari man find: -exec command {} +: ...The command line is built in much the same way that xargs.... Membuat saya berpikir tentang baris perintah git filter-branch...;) - Volker Siegel