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

Vi просто означает Visual, как в Visual Editor. Vim означает Visual Improved, как в Visual Editor Improved.wikibooks

1
задан 16 June 2014 в 13:01

9 ответов

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

sudo apt-get install jedit

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

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

26
ответ дан 25 May 2018 в 16:22
  • 1
    Это было прекрасно, когда я искал целую строку кода и не решался избежать каждого отдельного символа регулярного выражения, если бы я сделал то же самое с sed. – IQAndreas 8 September 2013 в 00:47
  • 2
    вы можете заменить блоки кода (например, html, javascript и т. д.) за считанные секунды. – lepe 25 March 2014 в 15:09
  • 3
    Это не работает на большом количестве файлов, через пару часов он не сделал одну замену, а geany занял несколько минут, чтобы найти все события. Это может быть неэффективный поиск и замена, но он хорошо подогревал комнату. – Mark Aroni 29 March 2018 в 11:26

Другой вариант GUI - regexxer:

17
ответ дан 25 May 2018 в 16:22
  • 1
    Отлично работает (если вы уже знакомы с Regex), спасибо. – Ernest 3 February 2014 в 18:10
perl -pi -e 's/oldtext/newtext/g' *

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

10
ответ дан 25 May 2018 в 16:22

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

9
ответ дан 25 May 2018 в 16:22
  • 1
    Я люблю Geany! Это мой любимый редактор и достаточно мощный. – Pisu 7 December 2011 в 16:35
  • 2
    Насколько я могу судить, Geany 1.23.1 (в комплекте с Ubuntu 13.10) позволяет искать несколько файлов, используя регулярное выражение, но не заменяя их. – Drew Noakes 12 December 2013 в 05:35
  • 3
    Вы можете искать и заменять в нескольких файлах Geany, если вы открываете их все, а затем используете «в сеансе». в диалоговом окне «Поиск / замена». – MV. 4 May 2016 в 01:58
  • 4
    Как открыть 5000 файлов, перечисленных на вкладке сообщений? – Mark Aroni 28 March 2018 в 17:41

Я написал небольшой сценарий только для этой цели. Если вам нужны только основы и не знакомы с 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
ответ дан 25 May 2018 в 16:22

Вы можете использовать этот скрипт, скопировать код и сделать файл 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
ответ дан 25 May 2018 в 16:22

Другая программа - Searchmonkey.

SearchMonkey - это легкое приложение Gtk, которое предназначено для замены громоздкого find / grep с помощью гладкого пользовательского интерфейса, который быстро обеспечивает разметку, показывающую местоположения и количество текста Матчи. Цель состоит в том, чтобы предоставить простой и удобный инструмент поиска для конечных пользователей и разработчиков программного обеспечения.
2
ответ дан 25 May 2018 в 16:22
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

работает для меня на fedora

2
ответ дан 25 May 2018 в 16:22
  • 1
    Вы можете добавить строку, объясняющую, как это улучшается над askubuntu.com/a/84013/158442 – muru 19 September 2014 в 05:30
  • 2
    @muru Это работает намного меньше sed экземпляров! Таким образом, это намного быстрее с точки зрения времени процессора. Поскольку время доступа к файлу будет ограничено, я думаю, что это не намного быстрее в такт, но дает более низкую нагрузку на систему. Примечание. [F2] будет помещать партии, например, хэндеры, имена файлов в командной строке одной команды sed - заполнение доступного размера буфера в зависимости от длины путей. – Volker Siegel 19 September 2014 в 06:07
  • 3
    Хм ... если это закрывается, я могу заменить его тем, что ясно объясняет, почему он лучше, чем предыдущий. – Volker Siegel 19 September 2014 в 06:08
  • 4
    @VolkerSiegel, который может быть достигнут с помощью + вместо \; в find, правильно? – muru 19 September 2014 в 06:21
  • 5
    @muru Возможно ... Мой «простой инструмент для работы» - в явной форме предпочитает xargs, но вы правы; из man find: -exec command {} +: ... The command line is built in much the same way that xargs.... Заставляет меня думать о командных строках git filter-branch ...;) – Volker Siegel 19 September 2014 в 06:26

Очень простое решение: замените все *.txt файлы в папке string_1 на string_2:

sed -i 's/string_1/string_2/g' *.txt
2
ответ дан 25 May 2018 в 16:22
  • 1
    Отличный ответ! Просто добавление. Если вы хотите заменить строку в любом файле текущего каталога рекурсивно, попробуйте это: sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./) – drugan 12 May 2018 в 13:08

Другие вопросы по тегам:

Похожие вопросы: