Найти и заменить текст в нескольких файлах

84

Я хочу знать, как я могу найти и заменить определенный текст в нескольких файлах, как в Notepad ++ в связанном учебнике.

например: 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" {} \;
gregtczap
источник
2
Проголосовал за это, потому что это такой эффективный метод
Сабакон
4
Проголосовали, потому что sed - лучший выбор IMO, но ответ был бы более полезен, если бы вы объяснили компоненты ответа (лично я не знаком и не заинтересован в {} \;)
sequoia mcdowell
5
@sequoiamcdowell Ву! Я пропустил это! Сожалею. Скобки в основном означают «для каждого совпадения», а экранированная точка с запятой (\;) предназначена для предотвращения двойного анализа. Мы не хотим, чтобы bourne-совместимая оболочка и sed пытались разобрать команду, просто sed.
@ Кристофер, как это работает, если слово содержит такие пробелы, как 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 ++ и делает то же самое, я считаю, что это то, что вы хотите.

Sabacon
источник
Это было прекрасно, когда я искал целую строку кода, и не решался избегать каждого специального символа регулярного выражения, если я делал то же самое с sed.
IQAndreas
Вы можете заменить блоки кода (например, html, javascript и т. д.) за считанные секунды.
Лепе
Это не работает с большим количеством файлов, через пару часов он не сделал ни одной замены, в то время как geany понадобилось несколько минут, чтобы найти все вхождения. Это не может быть эффективным поиском и заменой, но это хорошо согревало комнату.
Марк Арони
19

Другой вариант графического интерфейса - regexxer : скриншот regexxer

int_ua
источник
Работает отлично (если вы уже знакомы с Regex), спасибо.
Эрнест
1
Даже, если вы не знаете регулярное выражение, вы можете использовать этот инструмент как простой инструмент поиска и замены строк, и он сделает всю работу за вас, без необходимости регулярных выражений или чего-либо еще.
Мохд Абдул Муджиб
13
perl -pi -e 's/oldtext/newtext/g' *

заменяет все вхождения oldtext на newtext во всех файлах в текущей папке. Однако вам придется экранировать все специальные символы Perl внутри oldtext и newtext, используя обратную косую черту.

Майкл К
источник
9

Посоветуйтесь с Geany , это идеальная замена АЭС для Linux. Вы можете сделать именно это, плюс вы можете использовать регулярные выражения.

Стефано Мтангу
источник
Я люблю Джани! Это мой любимый редактор и достаточно мощный.
Пису
1
Насколько я могу судить, Geany 1.23.1 (в комплекте с Ubuntu 13.10) позволяет искать несколько файлов с помощью регулярных выражений, но не заменять их.
Дрю Ноакс
Вы можете найти и заменить в Geany несколько файлов, если откроете их все, а затем с помощью кнопки «в сеансе» в диалоговом окне «Поиск / замена».
М.В.
1
Как открыть 5000 файлов, перечисленных на вкладке сообщений?
Марк Арони
1
Хорошо, регулярное выражение было в значительной степени тем, о чем я просила, я только что пропустил его раньше из-за его имени с регулярным выражением, и я просто стараюсь избегать чего-либо, связанного с регулярным выражением. Но я был неправ, и этот инструмент имеет именно то, что требуется для поиска и замены.
Мохд Абдул Муджиб
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, целью которого является замена громоздкого find / grep на удобный пользовательский интерфейс, который быстро предоставляет разметку, показывающую местоположение и количество текстовых совпадений. Цель состоит в том, чтобы предоставить простой в использовании и доступный инструмент поиска для конечных пользователей и разработчиков программного обеспечения.

vrcmr
источник
2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

у меня работает на федоре

user328359
источник
Вы можете добавить строку, объясняющую, как это улучшается по сравнению с askubuntu.com/a/84013/158442
Muru
@muru У него гораздо меньше sedэкземпляров! Так что это намного быстрее с точки зрения процессорного времени. Поскольку время доступа к файлу будет ограниченным, я думаю, что оно не намного быстрее по времени, но дает меньшую нагрузку на систему. Примечание xargsбудет помещать множество, как скученные, имен файлов в командной строке одной sedкоманды - заполняя доступный размер буфера в зависимости от длины путей.
Фолькер Сигел
Хм ... если это закроется, я мог бы заменить его одним, четко объясняющим, почему это лучше, чем голосование против.
Фолькер Сигел
@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