Умный способ выполнить подобную замену (не достаточно простой для разности) в нескольких файлах?

Существует много путей; я предложил бы использовать крон sepcial строка @reboot.

 $ crontab -e

 @reboot /path/to/my/command.sh
4
14.09.2012, 02:57
3 ответа

Давайте сохраним это простым. Файлы подходят удобно к памяти, не потрудитесь читать их линию за линией или что-либо как этот. Perl -p (выполните итерации по содержанию файла), переключатель и -0777 “хлебайте режим” (считайте целый файл сразу, не линию за линией), удобны.

Для действия на несколько файлов удобно использовать -i (отредактируйте файлы на месте).

Для выполнения замены используйте s оператор замены. См. perlre#Modifiers для объяснения модификаторов msx.

perl -0777 -i.orig -p -e '
    s[
      ^(\s+)                                  # indentation
      \Q$(document).ready(function() {\E\n
      \s*(\w+)Init                            # function name
      (\(((?:(?>[^()]+)|(?3))*)\))            # balanced parentheses
      ;\n\s*\}\);
     ][
       ${1}initPage(\x27$2\x27, $3);
     ]msx;
' **/*.js

**/*.js соответствия все .js файлы в текущем каталоге и его подкаталогах рекурсивно. Это работает из поля в zsh. При использовании удара добавить shopt -s globstar к Вашему ~/.bashrc.

(Непротестированный, необходимо будет, вероятно, настроить regexp немного.)

1
27.01.2020, 20:58

Вывод дампов к stdout, так не повредит Ваши файлы на месте.

#!/usr/bin/perl

use strict;
use warnings;

# Slurp our input...
my $text = do {local $/; <> };

# Extract the varying parts: foo and bar, for fooInit(bar)
my ($init_prefix, $init_opts) = $text =~ m/([a-zA-Z0-9]+)Init\(([^;]+;)/m;

# Construct the replacement: fooInit(bar) -> initPage('foo', bar)
my $replace_with = "initPage('$init_prefix', $init_opts";

# Target the text to replace...
my $to_replace = '\$\(document.*;';

# Perform the replacement;
$text =~ s/$to_replace/$replace_with/gs;

print $text;

Протестированный на все три из Ваших примеров. Добавление отступа не корректно для заменяющих строк, хотя код является правильным, и первая строка замены запустится в правильном месте.

$ perl replace.pl 1.js

script type="text/javascript">
    initPage('editFile', opts);
</script>
{% endblock %}

$ perl replace.pl 2.js

 <script type="text/javascript">
    initPage('gallery', {
            editTitleUrl: {{ csrf_url_for('gallery_editpictitle')|tojson|safe }},
            delPicUrl: {{ csrf_url_for('gallery_delpic')|tojson|safe }}
        });
</script>

$ perl replace.pl 3.js

 <script type="text/javascript">
    initPage('songHistory', {
            dataURL: {{ url_for('stream_history_json')|tojson|safe }}
        });
</script>
1
27.01.2020, 20:58

Что-либо можно сделать с: исключая режимом в vi может быть превращен в сценарий для редактора

ed похож vi но без всего, что wimpy раздражающее удобное для пользователя интерфейсное стоять на пути и замедление Вы.

Все шутки в сторону, ed полезный инструмент для редактирования в виде сценария текстовых файлов.

1
27.01.2020, 20:58

Теги

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