Если вы откроете 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», которые вы упоминали в исходном сообщении, были разные значения, вам нужно указать.