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


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

например.: http://cybernetnews.com/find-replace-multiple-files/ 


73
2017-11-30 13:58


происхождения


У него не будет графического интерфейса, но я бы попросил вас изучить sed (man sed). Это редактор потоков, который существует с самого начала UNIX. - apolinsky


ответы:


Здесь я использую 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" {} \;

124
2017-11-30 14:15



Проголосовал за это, потому что это такой эффективный метод - Sabacon
Проголосовал за то, что sed - лучший выбор ИМО, но ответ был бы более полезен, если бы вы объяснили компоненты ответа (лично я не знаком и не интересуюсь {} \;) - sequoia mcdowell
@sequoiamcdowell Woo! Я пропустил это! Сожалею. Скобки означают в основном «для каждого соответствия», а экранированная полуточка (\;) - это предотвращение двойного разбора. Мы не хотим, чтобы совместимая с bourne оболочка и sed пытались разобрать команду, просто sed.
@ Кристофер, как это работает, если слово содержит пробелы вроде cyber net news? Как я могу преобразовать это в cyber net? - Khurshid Alam
@KhurshidAlam Используйте класс символов с ключом -e: sed -i -e "s/cyber\snet\snews/cyber net/g"


Редактор потока sed - мощная утилита для такого рода работ, и это мой первый выбор, однако, если вы хотите сделать это из обычного текстового редактора, используя собственное приложение на основе Ubuntu, я бы предложил вам взглянуть на Jedit , Он доступен в репозиториях и может быть установлен путем ввода в консоль:

sudo apt-get install jedit

Запустите jedit, щелкните пункт меню поиска, в списке меню, выберите элемент «Поиск в каталоге», вам будет представлено следующее диалоговое окно:

Jedit Search In Folder Dialog

Это похоже на работу Notepad ++ и делает то же самое, я считаю, что это то, что вы хотите.


26
2017-11-30 15:57



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


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


17
2017-11-30 17:26



Отлично работает (если вы уже знакомы с Regex), спасибо. - Ernest


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

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


13
2017-11-30 14:11





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


9
2017-11-30 14:35



Я люблю Geany! Это мой любимый редактор и достаточно мощный. - Pisu
Насколько я могу судить, Geany 1.23.1 (в комплекте с Ubuntu 13.10) позволяет искать несколько файлов, используя регулярное выражение, но не заменяя их. - Drew Noakes
Вы можете искать и заменять в нескольких файлах Geany, если вы открываете их все, а затем используете кнопку «in session» в диалоговом окне «Поиск / замена». - MV.
Как открыть 5000 файлов, перечисленных на вкладке сообщений? - Mark Aroni


Я написал небольшой сценарий только для этой цели. Если вам нужны только основы и не знакомы с sed и т. Д., Посмотрите здесь: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in-a-set-of-files/

Скрипт следующий:

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





Вы можете использовать этот скрипт, скопировать код и сделать файл 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
2017-08-01 15:36