1

У меня есть набор из 5000+ файлов, которые мне нужно сделать для простого поиска и замены. Я делал это в текстовом редакторе (EditPlus), открывая по 500 файлов за раз, выполняя глобальный поиск / замену, сохраняя все, закрывая и т.д. Но это занимает буквально часы, и это скучно и утомительно, и я уже сделал это однажды сегодня и должен сделать это снова, потому что все файлы были обновлены. Есть ли способ сделать это через командную строку Bash? Вот подробности:

Найти onchange="document.location ='/products/view.html/view/'+this.value"

Замените его на onchange="alert('Not implemented')" style="display: none"

Все файлы имеют.Расширение HTM, но они вложены в несколько подкаталогов.

РЕДАКТИРОВАТЬ - Я на Mac и предпочел бы решение на основе * nix.

2 ответа2

3

Базовая команда для вашего случая выглядит так:

sed -i 's|oldvalue|newvalue|g' file1 file2 file3

Если все ваши файлы находятся в каталоге ~/foo/bar/ , то вы хотите сделать следующее:

cd '~/foo/bar/'
find . -type f | xargs sed -i "" "s|onchange=\"document.location ='/products/view.html/view/'+this.value\"|onchange=\"alert\('Not implemented'\)\" style=\"display: none\"|g"

РЕДАКТИРОВАТЬ: глобус (* как имя файла) может быть проблематичным с очень очень большим количеством файлов и не помещаться в дочерние каталоги. В этом случае измените последнюю строку.

РЕДАКТИРОВАТЬ 2: с BSD sed (тот, который используется в MacOS X) -i нуждается в аргументе. Кстати, используя xargs . Благодаря @ Деннис Уильямсон

2

Так как EditPlus - редактор Windows, я думаю, вам нужно решение для оболочки Windows.

Вы можете получить sed-варианты для Windows, но вот решение PowerShell, которое рекурсивно находит все *.HTM-файлы, заменяет "this" на "that", затем сохраняет файл.

gci -Include *.HTM -Recurse | % {
  (gc $_) -replace "this","that" | sc -path $_ }

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

gci -Include temp*.HTM -Recurse | % {
  (gc $_) -replace "onchange=`"document\.location `
  =`'/products/view\.html/view/`'\+this\.value",`
  "onchange=`"alert(`'Not implemented`')`" style=`"display: `
  none`"" | sc -path $_ }

Powershell включен в Windows 7 и может быть загружен для XP и выше.

В StackOverflow есть однофайловое решение vbscript, которое я опубликовал в ответ на вопрос:«Есть ли какая-либо утилита, подобная sed, для cmd.exe?«Этот вопрос содержит много ответов с предложениями по решениям sed для командной строки Windows.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .