Хочеться знати, як я можу знайти та замінити певний текст у кількох файлах, як, наприклад, у Блокноті ++ у пов'язаному підручнику.
наприклад: http://cybernetnews.com/find-replace-multiple-files/
Хочеться знати, як я можу знайти та замінити певний текст у кількох файлах, як, наприклад, у Блокноті ++ у пов'язаному підручнику.
наприклад: 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
.
Ще один варіант GUI - це regexxer :
Зверніться до Geany , це ідеальна заміна АЕС для Linux. Ви можете зробити саме це, плюс можете використовувати регулярний вираз.
Я написав невеликий сценарій саме для цієї речі. Якщо вам потрібні лише основи, і ви не знайомі з sed тощо, подивіться тут: http://www.csrdu.org/nauman/2010/12/30/bash-script-to-find-and-replace-in -набір файлів /
Сценарій такий:
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 . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"
працює для мене на Fedora
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' ./)