Как найти и заменить содержание файлов, которое соответствует шаблону?

Можно запустить Linux на аппаратных средствах НАМНОГО более низкого уровня, чем какая-либо текущая версия окон, даже не волнуйтесь об этом. Это иногда - действительно новые аппаратные средства, что люди еще не сгладили ошибки драйвера, это иногда вызывает проблемы.

Что касается выбора дистрибутива, Вы получите миллион ответов и так как нет действительно правильного, Exchange Стека даже не является там правильным местом для задавания того вопроса. Однако я хотел бы предложить, как ответить на Ваш собственный вопрос вместо того, чтобы перейти прямо к ответу.

Необходимо выбрать любой дистрибутив, с которым люди вокруг Вас являются самыми знакомыми. Вы упоминаете, что Ваша лаборатория использует Fedora. Если Вы взаимодействуете с теми парнями, и другие люди узнают, что веревки Linux на Fedora идут с этим. Если парни по соседству являются фанатами Ubuntu, идут с этим. Если бы Вы болтались со мной и моими друзьями, то Вам настоятельно рекомендовали бы пойти с PLD-Linux. Если бы Вы жили в İstanbul, то Вы были бы лучше всего выключены с Pardus.

Linux лучше всего изучается и используется в некотором сообществе, и Вы сможете преобладать над некоторыми ранними проблемами кривой обучения более легко при выполнении его вместе с людьми, которые поразили те же проблемы. Каждый дистрибутив будет иметь различный набор проблем, различные грубые патчи, различные преимущества.

1
23.05.2017, 15:39
2 ответа

Простой текстовый подход, где Вы заменяете AnyFunction(arg1, &$arg2) AnyFunction(arg1, $arg2) если не предшествуется словом function, будет работать, если Ваш исходный код будет обоснованно отформатирован: никакое объявление функции на той же строке как вызов функции, никакие комментарии или новая строка между function и имя функции, никакие комментарии, содержащие незакрытые скобки в вызовах функции, и т.д. Это поймает комментарии и строковые литералы и может пропустить некоторые сложные вызовы функции (например, это не ловит &$arg2 в f(g(), &$arg2)).

Запустите этот скрипт на своих файлах, они будут изменены на месте. Предупреждение: непротестированный, сделайте резервные копии сначала!

#!/usr/bin/perl -pi
BEGIN { use warnings; use strict; undef $/; }
sub straighten_ampersands {
    my ($args, $want_ampersands) = @_;
    $want_ampersands = ($want_ampersands ? "&" : "");
    $args =~ s{ ([(,]\s*) &? (\$\w) }
              { $1 $want_ampersands $2 }x;
}
s{
  (\bfunction\s+|)(\w+\s+)      # optional 'function' keyword, then function name
  (\((?:(?>[^()]+)|(?4))*)\)))  # balanced parentheses (from perlre)
 }{
  "$1$2" . straighten_ampersands($3, $1 ne "")
 }ex
3
27.01.2020, 23:17

Это - довольно простой поиск и замена sed.

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

    find Project -name '*.php' -print0 | xargs -0r sed -i -e 's/&\$/$/g'

  2. Как выше, но ограничение поиска-и-замены только к первому аргументу вызова функции или определения (как в Вашем примере выше):

    find Project -name '*.php' -print0 | xargs -0r sed -i -e 's/(&\$/($/g'

  3. Как в 1. выше, но ограничение замены к строкам, где и $ найден внутренние круглые скобки:

    find Project -name '*.php' -print0 | xargs -0r sed -i -e '/([^)]*&\$[^)]*)/ s/&\$/$/g'

    note1: это все еще изменит любого другого &$ на той же строке, которые являются внешними круглыми скобками, но только на строках, где это было уже найдено внутренние круглые скобки (...&$...)

    note2: это не изменится &$ на вторых и последующих строках многострочных вызовов функции или определений.... они не соответствуют критериям поиска.

Во всех случаях сделайте рабочую копию своего Каталога проекта и работайте с этим. Когда это изменяется на то, что Вы хотите, и Вы протестировали это, это работает (по крайней мере, не представляя больше проблем, чем это решает), переместите реальный Каталог проекта в сторону (например. mv Project Project.old) и затем переместите измененный Проект в место (например, mv Project.workingcopy Project)

2
27.01.2020, 23:17

Теги

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