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


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" {} \;

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 ++ и делает то же самое, я считаю, что это то, что вы хотите.


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

Вы можете заменить блоки кода (например, html, javascript и т. д.) за считанные секунды.
Лепе

Это не работает с большим количеством файлов, через пару часов он не сделал ни одной замены, в то время как geany понадобилось несколько минут, чтобы найти все вхождения. Это не может быть эффективным поиском и заменой, но это хорошо согревало комнату.
Марк Арони

19

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


Работает отлично (если вы уже знакомы с 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 на удобный пользовательский интерфейс, который быстро предоставляет разметку, показывающую местоположение и количество текстовых совпадений. Цель состоит в том, чтобы предоставить простой в использовании и доступный инструмент поиска для конечных пользователей и разработчиков программного обеспечения.


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

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


Вы можете добавить строку, объясняющую, как это улучшается по сравнению с 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.