Определение операции поиска и замены в файле - PullRequest
3 голосов
/ 28 января 2011

Представьте, что у вас есть исходный файл, в котором кто-то переименовал один символ в другой, используя простую текстовую замену.Вывод diff для этого файла, как правило, довольно длинный и не очень полезный идентификатор того, что произошло.То, что вы хотите знать, это то, что если изменение было просто s/a/b/g, и если да, то что такое a и b - вы не будете рассказывать об этом инструменте заранее, ему придется отработать его длясам.(Здесь вы можете предположить, что «a» и «b» не будут содержать символов новой строки, ради аргумента.)

  • Какой алгоритм вы бы использовали для поиска и замены?(легко)
  • Как бы вы работали, если бы произошло несколько текстовых замен?(довольно просто)
  • Как бы вы написали его для работы с выводом diff, не сравнивая ни один из исходных файлов?(довольно сложно)
  • Как далеко вы можете это сделать, например, путем определения соответствия регулярному выражению, а не поиска / замены?(трудно)
  • В файле, который содержит такие изменения наряду с другими, можете ли вы придумать эвристику, которая выдает выражение sed и значительно укороченный diff?(трудно)

Это вопрос для тех из вас, кому нравится разрабатывать алгоритмы, но он в значительной степени основан на реальном инструменте, который я хотел бы использовать, поэтому, если вам случится узнать хорошую командуинструмент линии, который делает любой из вышеупомянутых, бонусных пунктов.;)

Ответы [ 2 ]

1 голос
/ 28 января 2011

Darcs (распределенная система управления версиями) имеет специальную обработку для таких изменений, поэтому он имеет алгоритм для этого.Поэтому попробуйте заглянуть в их документацию / спросить их.Повторное использование алгоритма может быть несколько сложным, поскольку он написан на Haskell .

1 голос
/ 28 января 2011

Два варианта, о которых я думаю прямо сейчас:

  • Запустите /s/b/a/g и проверьте файлы (хотя это, очевидно, не обнаружит ошибку в вашем регулярном выражении)
  • Сделайте свойинструмент diff, который работает так же, как и другие, но принимает определенные изменения, не показывая его как разницу (т. е. если линия отличается, и эта линия отличается только на a с одной стороны и b с другой, donне отмечать линию)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...