Я хочу знать, как я могу найти и заменить определенный текст в нескольких файлах, как в Notepad ++ в связанном учебнике.
например: http://cybernetnews.com/find-replace-multiple-files/
Я хочу знать, как я могу найти и заменить определенный текст в нескольких файлах, как в Notepad ++ в связанном учебнике.
например: http://cybernetnews.com/find-replace-multiple-files/
Ответы:
Здесь я использую 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" {} \;
cyber net news
? Как я могу преобразовать это в cyber net
?
Потоковый редактор sed является мощной утилитой для такого рода работ и является моим первым выбором, однако, если вы хотите сделать это из обычного текстового редактора с помощью собственного приложения на основе Ubuntu, я бы посоветовал вам взглянуть на Jedit. , Он доступен в репозиториях и может быть установлен, набрав в консоли:
sudo apt-get install jedit
Запустите jedit, щелкните пункт меню поиска, в списке меню выберите пункт Поиск в каталоге, вы увидите диалоговое окно ниже:
Это похоже на Notepad ++ и делает то же самое, я считаю, что это то, что вы хотите.
sed
.
Другой вариант графического интерфейса - regexxer :
Посоветуйтесь с Geany , это идеальная замена АЭС для Linux. Вы можете сделать именно это, плюс вы можете использовать регулярные выражения.
Я написал небольшой сценарий только для этой вещи. Если вам нужны только основы и вы не знакомы с sed и т. Д., Посмотрите здесь: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in -a-множество-файлов /
Сценарий следующий:
for f in submit_*;
do sed "s/old_db_name/new_db_name/" < $f > a_$f ;
mv a_$f $f ;
done
Вы можете использовать этот скрипт, скопировать код и сделать файл 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
Другая программа - Searchmonkey .
SearchMonkey - это легковесное приложение Gtk, целью которого является замена громоздкого find / grep на удобный пользовательский интерфейс, который быстро предоставляет разметку, показывающую местоположение и количество текстовых совпадений. Цель состоит в том, чтобы предоставить простой в использовании и доступный инструмент поиска для конечных пользователей и разработчиков программного обеспечения.
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"
у меня работает на федоре
sed
экземпляров! Так что это намного быстрее с точки зрения процессорного времени. Поскольку время доступа к файлу будет ограниченным, я думаю, что оно не намного быстрее по времени, но дает меньшую нагрузку на систему. Примечание xargs
будет помещать множество, как скученные, имен файлов в командной строке одной sed
команды - заполняя доступный размер буфера в зависимости от длины путей.
+
вместо \;
в find
, верно?
xargs
, но ты прав; из man find
: -exec command {} +
: ... The command line is built in much the same way that xargs...
. Заставляет меня думать о командных строках git filter-branch
...;)
Очень простое решение: замените все *.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' ./)