Самый простой способ правильно искать и заменять исходный код - PullRequest
2 голосов
/ 23 декабря 2011

Каждый раз, когда возникает такая ситуация, которая происходит примерно раз в несколько месяцев, я трачу слишком много времени на то, чтобы выяснить сценарий bash, который выполняет именно то, что я хочу.Я почти уверен, что то, что я хочу, похоже на то, что хотят все остальные, но чаще всего доступные сценарии в Интернете, когда я выполняю быстрый поиск, упрощены и не делают этого (а мои собственные навыки написания сценариев на bash не хороши)достаточно, чтобы понять это):

  1. Он должен быть рекурсивным (обходить все дерево папок)
  2. Он должен позволять мне выбирать тип файла (например, "* .js"") потому что иногда дерево папок содержит двоичные файлы и файлы других типов, которые не следует искать
  3. Он должен заменить текст на месте, редактируя существующие файлы
  4. Это не должно вызывать источникконтроль (git, svn), чтобы думать, что файл был изменен, если он не был фактически изменен (я не знаю почему, но sed, кажется, делает это)
  5. Это должно позволить регулярные выражения

Как это можно сделать SIMPLEST ?Я имею в виду, я мог бы написать скрипт на python, это было бы всего несколько строк, но я чувствую, что это должно быть легко сделать в оболочке.

Ответы [ 6 ]

3 голосов
/ 23 декабря 2011

Это должно работать согласно вашему требованию:

find /path/to/dir/ -type f -name "*.txt" -exec sed -i 's/substitution/replacement/g' {} \;
|                 | |                     |    |                                   |     
 -----------------   ---------------------      -----------------------------------   
         |                     |                                 |                      
This will do the     This will allow you        This will do your substitution. -i       
search of files      to specify filename        option will do it inline. You can     
recursively for      You can also use           use -r option to use Extended Regex  
the supplied path.   -regex option for          as sed's native support is BRE.       
                      better search. -type
                     is to limit your search. 
                     i.e f for regular files,
                     d for directories, l for 
                     symbolic links etc
3 голосов
/ 23 декабря 2011

Обычно я делаю что-то вроде этого:

find . -name '*.hpp' -o -name '*.cpp' | xargs grep -l StuffToEdit

Затем я вижу, получаю ли я интересующие файлы.Если это так, я добавляю в конвейер:

| xargs sed -i 's@StuffToEdit@NewStuffInstead@g'

И позвольте мне разорвать.

Если sed заставляет вашу VCS думать, что файлы изменились, а они нет, вы должны посмотретьна диффах.Возможно, у вас в пробелах отключены пробелы, но это то, что меняется (окончания строк и т. П.)?

Я уверен, что кто-то придет и укажет, что одно или оба моих использования xargs там ненеобходимо, но для разовых работ это не имеет значения.В любом случае, я предпочитаю эти многопрограммные конвейеры для такого рода задач, поскольку я могу легко отключить или заменить определенные фильтры и проверить результаты остальных, если результаты сначала не верны.

2 голосов
/ 23 декабря 2011
find /path/to/source/tree -name \*.js -exec sed -i -e'edit stuff here' {} \;
0 голосов
/ 01 февраля 2017

Вы можете использовать команду ex (часть Vim, такая же, как vim -E), например,

ex "+bufdo! %s/foo/bar/g" -scxa **/*.js

Если ваша оболочка поддерживает новый параметр глобализации (включить с помощью:shopt -s globstar), ** будет работать рекурсивно.

Объяснение:

  • bufdo! - принудительно вызвать следующую команду для всех файлов из аргумента;
  • %s/foo/bar/g - s ubstitute foo до bar g lobally (% - весь файл, g - несколько экземпляров);
  • -scxa - s ilently exe c сохранить и выйти (x) a ll;

Использование ex имеетследующие преимущества перед sed:

  • sed - это S tream ED itor, а не редактор файлов. BashFAQ / 021
  • Символические ссылки не будут уничтожены, поскольку sed делает это по умолчанию .
  • Синтаксис ex более продвинут (поскольку он использует команды Vim) и более надежен (например, -i в sed является нестандартным расширением FreeBSD и может быть недоступен в других операционных системах).
0 голосов
/ 23 декабря 2011
find . -name "*.cpp" -o -name "*.hpp"|xargs perl -pi -e 's/search/replace/g'
0 голосов
/ 23 декабря 2011

Ну, вы можете сделать это с помощью следующего скрипта.

find . -name "*.js" | grep -v "\.svn" |xargs sed -i -e "s/src/dst/g"
  1. cd ваш проект dir
  2. найдите ваш целевой тип файла
  3. filter svnout
  4. поместите каждый файл в команду sed.
  5. в приведенном выше сценарии sed, "src" и "dst" поддерживают regx.

надеюсь, это поможетты:)

...