Сценарий оболочки для циклического перебора файлов и манипулирования строками - PullRequest
1 голос
/ 15 ноября 2011

Я хочу выполнять манипуляции со строками в нескольких файлах в иерархии каталогов.

У меня есть каталог проекта с файлами .m, и я хочу просмотреть все файлы;найти все экземпляры NSLocalizedString (ключ, комментарий) и изменить его на NSLocalizedStringFromTable (ключ, таблица, комментарий).

Простой поиск и замена не могут работать, потому что мне нужно вставить «таблицу» между ними, и я не могу сделатьэто вручную, так как в проекте есть как минимум 1200 экземпляров.

Логика будет примерно такой, я думаю:

  • перебрать структуру каталогов, чтобы найтивсе файлы .m

  • найти все экземпляры "NSLocalizedString"

  • скопировать "ключ" и "комментарий" в переменные var1 & var 2

  • заменить NSLocalizedString (ключ, комментарий) на NSLocalizedStringFromTable (var1, table, var2)

  • сохранить файл (не заменить его, сохранить его))

Так как мне написать скрипт для этого?

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Поскольку это проект Cocoa, почему вы не можете просто использовать поиск и замену всего проекта (⌘⌥⇧F) в IDE?Вот для чего это.

1 голос
/ 19 ноября 2011

Если вы откроете Terminal, cd в каталог, содержащий эти файлы, я считаю, что лучше всего будет найти эти файлы: find . -type f -name "*.m*" -print Он находит все в текущем каталоге ., который является файлом -type f имя которого *.m, *.mm, *.mmmmm и т. д. (*.m*).Затем вы выводите каждый полученный файл -print на консоль (или канал).Если вы хотите передать каждый из файлов другому процессу (используя xargs), лучше заменить -print на -print0, чтобы он правильно обрабатывал пробелы в именах файлов.

Далее используйте sed заменить текст в этих результатах.(Версия sed, которая поставляется с Mac, отличается от GNU sed и не будет правильно обрабатывать символы новой строки и другие специальные символы. Вам может потребоваться захватить эту версию, если она не работает для вас.)

Базовая структура замены: sed -i "" -e 's/NSLocalizedString(\(.*\), \(.*\))/NSLocalizedStringFromTable(\1, table, \2)/g' "FILENAME" -i "" заменяет файл на месте (сохраняет его в тот же файл, который был открыт).-e просто означает, что следующий текст будет выражением.Начало выражения с s/ означает, что вы собираетесь выполнять поиск и замену.Обычно это в формате: s/[search for this pattern]/[replace with this pattern]/g /g в конце означает «глобальный», или «сделать это для максимально возможного количества экземпляров, найденных в каждой строке».

Шаблон поиска,/NSLocalizedString(\(.*\), \(.*\))/, находит этот текст и затем копирует содержимое тегов \(...\) (вы должны выйти из скобок, чтобы sed знал, что его запомнил).

Шаблон замены, /NSLocalizedStringFromTable(\1, table, \2)/, замененNSLocalizedString с NSLocalizedStringFromTable, а затем заменил точную замену первой и второй пар \(.*\) на ссылки \1 и \2.

Если у вас было это буквальное значение: NSLocalizedString(@"Darn tootin'", @"How they say 'that is correct' in some dialects"); тогда результат будет выглядеть следующим образом: NSLocalizedStringFromTable(@"Darn tootin'", table, @"How they say 'that is correct' in some dialects");

Теперь @shellter спросил в комментариях, хотите ли вы, чтобы здесь было буквальное слово table, должен ли параметр 1 или параметр 2 происходить изразличные таблицы и т. д. Это, безусловно, изменит формат этой строки поиска.

Наконец, вы можете объединить две вышеупомянутые функции в один длинный скрипт оболочки и запустить его в Терминале: find . -type f -name "*.m*" -print0| \ xargs -0 -I FILENAME \ sed -i "" -e 's/NSLocalizedString(\(.*\), \(.*\))/NSLocalizedStringFromTable(\1, table, \2)/g' "FILENAME"

Если ты имеешь ввидуt для того, чтобы вместо «var1» и «var2», которые вы упоминали в исходном сообщении, были разные значения, вам нужно указать.

0 голосов
/ 15 ноября 2011

Вам нужно опубликовать несколько примеров, чтобы получить представление о шаблоне, который нужно заменить, но это кажется достаточно простой проблемой. Поймите, что вы можете использовать ["^]*?, чтобы остановиться на ". Оттуда это просто соответствующим образом разбить и собрать обратно.

Примером будет

'(NSLocalizedString\()("["^]*?)(,)("["^]*?)(\))', '\1\2\3#TABLE#\3\4\5'

Этот пример принимает NSLocalizedString("var1", "var2") в качестве ввода и делает его NSLocalizedString("var1", #table#, "var2").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...