LINUX.ORG.RU

Рекурсивная замена текста в файлах

 


2

1

Здравствуйте

Интересует графическая программа для масовой замены текста в большом к-ве файлов.

Желательно программа наподобие этой http://tr.infortech.ru/ только чтобы еще присутствовала функция заменить «от» и «до» было бы здорово.

Знаю что многие начнут плеваться мол через командную строку делай, я бы с радостью, но заменять нужно много и не просто слов а блоков кода в html файлах вида

---------- (function(d, s, id){

var js, fjs = d.getElementsByTagName(s)[0];

if (d.getElementById(id)) {return;}

js = d.createElement(s); js.id = id;

js.src = «//connect.facebook.net/en_US/sdk.js»;

fjs.parentNode.insertBefore(js, fjs);

}(document, 'script', 'facebook-jssdk'));*/ ----------

и заменять нужно много, потому ручками все это вводить учитывая пробелы и т.д. времени много уйдет.

Буду признателен за совет. Всем спасибо.



Последнее исправление: Nicolasik (всего исправлений: 2)

Знаю что многие начнут плеваться мол через командную строку делай, я бы с радостью, но заменять нужно много и не просто слов а блоков кода

Поэтому и удобнее в терминале это. Делаешь словарь (json) вида что_заменить:на_что_заменить, пишешь скрипт, который для каждой пары рекурсивно осуществляет замену в файлах с помощью find и sed.

Yorween
()
Ответ на: комментарий от Yorween

Я новичок в этом можно поподробней как это сделать или где почитать как это можно сделать? ну или может есть готовое решение. Было бы здорово, как я понял, сделать скрипт который будет выполнять замену, и мне только подставлять в файл значение. Это будет работать для разных кодировок файлов а именно ANSI и UTF-8?

Nicolasik
() автор топика
Ответ на: комментарий от Nicolasik

Простой пример

{
	"какой-то текст":"замена текста 1",
	"еще текст":"замена текста 2"
}
#!/usr/bin/env bash

cat json | jq -r 'to_entries[] | [.key, .value] | @csv' | while IFS=',' read -r x y
do
    find -mindepth 1 -type f -iname "*txt" -exec sed -i "s/${x//\"/}/${y//\"/}/g" {} \;
done
До
cat 1.txt 
какой-то текст 123
ddfdfеще текст

После
cat 1.txt 
замена текста 1 123
ddfdfзамена текста 2

Адаптируй под свои нужды.

Yorween
()

1. Сначала сделай бекап. 2. Чем трахаться с седом (как тебе советовали), имхо, проще на перле скрипт написать. Или уж на питоне.

debugger ★★★★★
()
Ответ на: комментарий от Yorween

sed

Многострочные шаблоны? Удачи.

anonymous
()

Интересно, какой смысл ТС вкладывает в слово «рекурсивная»

annulen ★★★★★
()
Ответ на: комментарий от Nicolasik

У тебя есть задача, в решении которой ты заинтересован. Это отличный мотиватор, причина и повод изучить что-то новое. Вот тебе перловая рыба:

#!/usr/bin/perl

use strict;
use warnings;
use Path::Tiny;

my $iter = path( "path/to/your/dir" )->iter( { recursive => 1 } );
while ( my $path = $iter->() ) {
    if ( $path->is_file ) {
         my $text = $path->slurp_utf8();
         $text ~= s/search/replace/g;
         $path->spew_utf8( $text );
    };
};

See also https://perldoc.perl.org/perldoc.html, https://metacpan.org/pod/Path::Tiny.

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

Скрипт написать это пока не в моих силах…

При таком настрое сил у тебя никогда не будет.

debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 2)
Ответ на: комментарий от debugger

При выполнении Вашего скрипта выдает ошибку

Can't locate Path/Tiny.pm in @INC (you may need to install the Path::Tiny module) (@INC contains: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .) at /Users/nicolasik/Documents/reply.pl line 5.
BEGIN failed--compilation aborted at /Users/nicolasik/Documents/reply.pl line 5.

Но на сайте perl.org пишет что у меня уже есть perl

Nicolasik
() автор топика
find /home/my_folder -type f -readable -writable -exec sed -i "s/hello_my_friend_billy/fuck_you_billy/g" {} \;

Тред не читал,шапку не читал

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)
Ответ на: комментарий от Deleted

в вашем случае ошибка

find: -readable: unknown primary or operator

и если делать замену скажем

s/<!--[if lt IE 9]>/<!--[if lt IE 9]ssss>/g

то

-bash: !--[if: event not found

Nicolasik
() автор топика
Ответ на: комментарий от Nicolasik

Нашел програмку которая делает то что нужно, смог установить на macos но она создает копии а не перезаписывает файл при замене(

еще и название файла name.html меняет на #name.html#

https://sourceforge.net/projects/jedit/

Nicolasik
() автор топика
Ответ на: комментарий от Nicolasik

еще 1 програмка

http://www.hexmonkeysoftware.com/

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

Ищем дальше...

Nicolasik
() автор топика

графическая

не то, чтобы графическая, но вот.

первый обязательный аргумент — файл, содержащий искомый текст, второй обязательный аргумент — файл содержащий текст замены, третий обязательный аргумент — директория, которую нужно обработать, типа

$ python3 recursive_replace.py old.txt new.txt /path/to/dir

справка по опциям:

usage: recursive_replace.py [-h] [-c N] [-ext EXTENSIONS_LIST]
                            [-e ENCODINGS_LIST] [-es ENCODING] [-er ENCODING]
                            [-f]
                            <search_for.txt> <replace_with.txt> DIR_OR_FILE
                            [DIR_OR_FILE ...]

Replaces text in files scanning directories recursively. Matched files names
are printed to stdout.

positional arguments:
  <search_for.txt>      contents of this file will be searched
  <replace_with.txt>    if found in searched files, contents of
                        `search_for.txt` will be replaced with contents of
                        `replace_with.txt`
  DIR_OR_FILE           directory or file to be processed; directories are
                        scanned recursively

optional arguments:
  -h, --help            show this help message and exit
  -c N                  maximum replacements count in one file; 0 disables
                        replacement, so only search will be performed
  -ext EXTENSIONS_LIST  comma separated lower case list of file extensions;
                        only files with extensions specified will be
                        processed; default is to process all files
  -e ENCODINGS_LIST     comma separated list of encodings to open files with;
                        default is 'utf-8,cp1251'
  -es ENCODING          encodings for `search_for.txt`; default is 'utf-8'
                        (system)
  -er ENCODING          encodings for `replace_with.txt`; default is 'utf-8'
                        (system)
  -f                    follow symbolic links; default is not to follow except
                        those that explicitly passed as arguments

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

функция заменить «от» и «до»

это не понял

anonymous
()
Ответ на: комментарий от goingUp

Попробовал шторм

Прога хорошая и делает то что хотел, единственное дороговата( 200$ в год

Но спасибо за совет пока 30 дневной триал версией пользуюсь

Nicolasik
() автор топика
Ответ на: комментарий от Nicolasik

Can't locate Path/Tiny.pm

$ sudo dnf install perl-Path-Tiny

Но на сайте perl.org пишет что у меня уже есть perl

??? Только что ходил на сайт perl.org, не видел чтоб там было написано что у Николасика уже есть перл.

debugger ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.