Примените замену регулярного выражения глобально ко многим файлам со сценарием

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

Я попробовал sed, но обработка больше чем одной строки за один раз является неловкой, особенно если нет никакого предела тому, какому количеству строк шаблон мог бы соответствовать.

Я также попробовал этот сценарий (на единственном файле для тестирования):

ex $1 <<EOF
gs/,\(\_\s*[\]})]\)/\1/
EOF

Шаблон устранит запаздывающую запятую в любом списке Perl/Ruby-style, так, чтобы" [a, b, c]" вышел как" [a, b, c]" для удовлетворения Internet Explorer, который один среди браузеров, дросселей в таких списках.

Шаблон работает красиво в энергии, но ничего не делает, если я выполняю его в исключая согласно вышеупомянутому сценарию.

Кто-либо может видеть то, что я мог бы пропускать?

7
задан Eric Hu 7 February 2012 в 02:03
поделиться

5 ответов

Вы просили скрипт, но упомянули, что вы пользователь 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 моих файлов.

12
ответ дан 6 December 2019 в 08:41
поделиться

вы можете использовать комбинацию команды find и sed

find /path -type f -iname "*.js" -exec sed -i.bak 's/,[ \t]*]/]/' "{}" +;
1
ответ дан 6 December 2019 в 08:41
поделиться

Если вы работаете в Windows, Notepad ++ позволяет запускать простые регулярные выражения для всех открытых файлов.

Найдите , \ s * \] и замените его на ]

должно работать для описываемых вами типов списков.

0
ответ дан 6 December 2019 в 08:41
поделиться

1) Откройте все файлы с помощью vim:

bash$ vim $(find . -name '*.js')

2) Примените команду substitute ко всем файлам:

:bufdo %s/,\(\_\s*[\]})]\)/\1/ge

3) Сохраните все файлы и выйдите:

:wall
:q

Я думаю, вам нужно перепроверить шаблон поиска, он выглядит неправильно. Думаю, там, где у вас \_\s*, вместо этого должно быть \_s*.

Edit: Вы также должны использовать опции /ge для :s... команды (я добавил их выше).

5
ответ дан 6 December 2019 в 08:41
поделиться

Вы можете автоматизировать действия как vi , так и ex , передав аргумент + 'command' из командной строки. , что позволяет использовать их в качестве текстовых фильтров.

В вашей ситуации следующая команда должна работать нормально:

find / path / to / dir -name '* .js' | xargs ex + '% s /, \ (\ _ \ s * [\]})] \) / \ 1 / g' + 'wq!'

3
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: