Знайдіть і замініть текст у кількох файлах


84

Хочеться знати, як я можу знайти та замінити певний текст у кількох файлах, як, наприклад, у Блокноті ++ у пов'язаному підручнику.

наприклад: http://cybernetnews.com/find-replace-multiple-files/


У нього не буде графічного інтерфейсу, але я б закликав вас вивчити sed (man sed). Саме редактор потоків існує з початку UNIX.
аполінський

Відповіді:


136

Тут я використовую sed, щоб замінити кожне виникнення слова "cybernetnews" на "cybernet" у кожному файлі з розширенням, c, в каталозі, / home / user / directory /.

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 - найкращий вибір ІМО, але відповідь буде кориснішою, якби ви пояснили компоненти відповіді (особисто я не знайомий і цікавий {} \;)
секвойя mcdowell

5
@sequoiamcdowell Ву! Я пропустив це! Вибачте. Підтяжки означають в основному "для кожного матчу", а втекла напівкрапка (\;) - це запобігання подвійного розбору. Ми не хочемо, щоб сумісна з Bour оболонка і sed намагалися проаналізувати команду, просто sed.

@Christopher Як це працює, якщо слово містить пробіли cyber net news? Як я можу це перетворити cyber net?
Хуршид Алам

1
@KhurshidAlam Використовуйте клас символів за допомогою перемикача -e:sed -i -e "s/cyber\snet\snews/cyber net/g"

27

Редактор потоку, sed, є потужною утилітою для подібної роботи, і це мій перший вибір, однак, якщо ви хочете зробити це за допомогою звичайного текстового редактора за допомогою нативного додатка на базі Ubuntu, я б запропонував вам поглянути на Jedit , Він доступний у сховищах і може бути встановлений, ввівши у консолі:

sudo apt-get install jedit

Запустіть jedit, натисніть на пункт меню пошуку, у списку меню натисніть пункт Пошук у каталозі, вам відкриється діалогове вікно нижче:

Пошук Jedit у діалоговому вікні папок

Це схоже на те, що у Notepad ++ і робить те ж саме, я вважаю, що ви цього хочете.


Це було ідеально, коли я шукав увесь рядок коду, і не вагався, щоб уникнути кожного спеціального символу регулярного виразу, якби я зробив те саме sed.
IQAndreas

ви можете замінити кодові блоки (наприклад, html, javascript тощо) за лічені секунди.
lepe

Це не працює для великої кількості файлів, через пару годин він не здійснив жодної заміни, тоді як geany знадобилося кілька хвилин, щоб знайти всі події. Це може бути не ефективним пошуком і заміною, але це добре пригріло приміщення.
Марк Ароні

19

Ще один варіант GUI - це regexxer : скріншот regexxer


Відмінно працює (якщо ви вже знайомі з Regex), дякую.
Ернест

1
Навіть якщо ви не знаєте регулярного вибору, ви можете використовувати цей інструмент як простий інструмент пошуку та заміни рядків, і він зробить роботу за вас, не потребує регулярного вибору або нічого іншого.
Мохд Абдул Муджіб

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

замінює будь-яке виникнення старого тексту на новий текст у всіх файлах поточної папки. Однак вам доведеться уникати всіх спеціальних символів Perl у старому тексті та новому тексті за допомогою зворотної косої риски.


9

Зверніться до Geany , це ідеальна заміна АЕС для Linux. Ви можете зробити саме це, плюс можете використовувати регулярний вираз.


Я люблю Генія! Це мій улюблений редактор і досить потужний.
Пісу

1
Наскільки я можу сказати, Geany 1.23.1 (упакований з Ubuntu 13.10) дозволяє шукати декілька файлів за допомогою регулярних виразів, але не замінювати їх.
Дрю Ноакс

Ви можете шукати та замінювати в Geany декілька файлів, якщо відкрити їх усі, а потім скористатися кнопкою "в сеансі" у діалоговому вікні Пошук / Заміна.
МВ.

1
Як відкрити 5000 файлів, перелічених на вкладці повідомлень?
Марк Ароні

1
Гаразд, Regexxer був майже в чому те, про що я просив, я просто пропустив його раніше, оскільки його назва мала регулярний вираз, і я просто схильний уникати нічого спільного з регексом. Але я помилявся, оскільки цей інструмент має саме те, що потрібно для пошуку та заміни.
Мохд Абдул Муджіб


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, який має на меті замінити громіздку знахідку / греп на гладкий користувальницький інтерфейс, який швидко забезпечує розмітку, де відображаються місця та кількість збігів тексту. Мета - забезпечити простий у використанні та доступний інструмент пошуку для кінцевих користувачів, так і розробників програмного забезпечення.


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

працює для мене на Fedora


Ви можете додати рядок, що пояснює, як це покращується в порівнянні з askubuntu.com/a/84013/158442
muru

@muru Це працює набагато менше sedекземплярів! Так це набагато швидше з точки зору часу на процесор. Оскільки час доступу до файлів був би обмежуючим, я думаю, що це не набагато швидше за годинний час, але дає меншу завантаженість системи. Примітка xargsпомістить лоти, начебто хундери, імена файлів у командному рядку однієї sedкоманди - заповнення наявного розміру буфера залежно від довжини шляхів.
Volker Siegel

Гм ... якщо це закриється, я міг би замінити його одним чітко пояснюючим, чому це краще, ніж прихильне.
Volker Siegel

@VolkerSiegel, чого можна досягти +замість того, \;щоб find, правда?
муру

1
@muru Можливо ... Мій "жорсткий інструмент для роботи" -інстинкт явно вважає за краще xargs, але ти маєш рацію; з man find: -exec command {} +: ... The command line is built in much the same way that xargs.... Змушує задуматися над командними рядками git filter-branch...;)
Volker Siegel

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' ./)
drugan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.