Я хочу применить определенную замену регулярного выражения глобально приблизительно к 40 файлам JavaScript в и в соответствии с каталогом. Я - пользователь энергии, но выполнение этого вручную может быть утомительно и подвержено ошибкам, таким образом, я хотел бы автоматизировать его со сценарием.
Я попробовал sed, но обработка больше чем одной строки за один раз является неловкой, особенно если нет никакого предела тому, какому количеству строк шаблон мог бы соответствовать.
Я также попробовал этот сценарий (на единственном файле для тестирования):
ex $1 <<EOF
gs/,\(\_\s*[\]})]\)/\1/
EOF
Шаблон устранит запаздывающую запятую в любом списке Perl/Ruby-style, так, чтобы" [a, b, c]" вышел как" [a, b, c]" для удовлетворения Internet Explorer, который один среди браузеров, дросселей в таких списках.
Шаблон работает красиво в энергии, но ничего не делает, если я выполняю его в исключая согласно вышеупомянутому сценарию.
Кто-либо может видеть то, что я мог бы пропускать?
Вы просили скрипт, но упомянули, что вы пользователь vim. Я обычно делаю поиск и замену по всему проекту внутри vim, например, так:
:args **/*.js | argdo %s/,\(\_\s*[\]})]\)/\1/ge | update
Это очень похоже на решение :bufdo
, упомянутое другим комментатором, но оно использует ваш список args, а не buflist (и, таким образом, не требует совершенно новой сессии vim и не требует от вас осторожности при закрытии буферов, которые вы не хотите трогать).
:args **/*.js
- устанавливает ваш список args для всех .js файлов в этом каталоге и подкаталогах|
- pipe является разделителем команд vim, позволяя нам иметь несколько команд на одной строке:argdo
- запустить следующую команду(ы) по всем аргументам. это "проглотит" последующие pipes
%
- диапазон, представляющий весь файл:s
- команда замены, о которой вы уже знаете:s_flags
, ge
- глобальные (заменять столько раз на строку, сколько возможно) и подавляющие ошибки (т.е.. "No match")|
- эта труба "проглатывается" :argdo
, так что следующая команда также работает один раз на аргумент:update
- как :write
, но только когда буфер был измененЭтот шаблон, очевидно, будет работать для любой команды vim, которую вы хотите выполнить для нескольких файлов, так что его удобно иметь в виду. Например, мне нравится использовать его для удаления пробельных символов (%s/\s\+$//
), установки единообразных окончаний строк (set ff=unix
) или кодировки файла (set filencoding=utf8
), а также retab
моих файлов.
вы можете использовать комбинацию команды find и sed
find /path -type f -iname "*.js" -exec sed -i.bak 's/,[ \t]*]/]/' "{}" +;
Если вы работаете в Windows, Notepad ++ позволяет запускать простые регулярные выражения для всех открытых файлов.
Найдите , \ s * \]
и замените его на ]
должно работать для описываемых вами типов списков.
1) Откройте все файлы с помощью vim:
bash$ vim $(find . -name '*.js')
2) Примените команду substitute ко всем файлам:
:bufdo %s/,\(\_\s*[\]})]\)/\1/ge
3) Сохраните все файлы и выйдите:
:wall
:q
Я думаю, вам нужно перепроверить шаблон поиска, он выглядит неправильно. Думаю, там, где у вас \_\s*
, вместо этого должно быть \_s*
.
Edit: Вы также должны использовать опции /ge
для :s...
команды (я добавил их выше).
Вы можете автоматизировать действия как vi
, так и ex
, передав аргумент + 'command'
из командной строки. , что позволяет использовать их в качестве текстовых фильтров.
В вашей ситуации следующая команда должна работать нормально:
find / path / to / dir -name '* .js' | xargs ex + '% s /, \ (\ _ \ s * [\]})] \) / \ 1 / g' + 'wq!'