
Я хочу выполнить сложный поиск и замену, которые я делаю с помощью notepad++, используя командную строку. Я нашел много решений в Интернете, но ни одно из них не соответствует моим требованиям.
У меня есть один файл, в котором я хочу выполнить поиск и замену с помощью регулярных выражений.
Другой файл, содержащий строки регулярных выражений (как для поиска, так и для замены. Я могу поиграться с этим, чтобы создать два отдельных файла или что-то еще.)
Пожалуйста, также расскажите, как разместить регулярные выражения для поиска и замены строк в этом файле, если это возможно сделать.
Редактировать
Есть ли какая-нибудь совместимая с PCRE утилита поиска и замены для Windows?
решение1
есть команда windows "findstr", но она не может заменить и имеет ограниченную поддержку регулярных выражений. Кроме того, посмотрите, как это сделать с *nix, а затем используйте эти инструменты в windows. Так что вы можете получить grep и sed для windows.
Некоторые пакетные пользователи могут использовать инструмент (возможно, созданный экспертом по пакетным файлам Дэйвом Бенхэмом), который объединяет Microsoft JScript с пакетными файлами и имеет опции поиска и замены. Я думаю, это идеально, если у вас очень заблокированная система и вы не можете даже загрузить EXE. Но в противном случае загрузка или копирование/вставка скрипта почти как получение стороннего продукта, и тогда уже есть инструменты, такие как grep и sed, которые широко используются и могут быть загружены для Windows.
Это *?
ленивая оценка, которая немного сложнее и требует -P (PCRE — регулярные выражения, совместимые с Perl)
C:\>echo abccccdd| grep -oP "a.*?c"
abc
C:\>
Если хотите, можете убрать -P, если регулярное выражение менее продвинутое. Хотя я его оставляю.
Sed не заходит так далеко, как PCRE, но поддерживает то, что, похоже, является следующим лучшим вариантом среди этих утилит командной строки. ERE (расширенные регулярные выражения). Использование sed с -r может избавить вас от необходимости использовать лишние обратные косые черты. В последний раз, когда я проверял, без -r он использовал BRE (базовые регулярные выражения).
Это означает, что нужно заменить это регулярное выражение ничем.
C:\>echo abccccdd| sed -r "s/c{2,3}//"
abcdd
Этот модификатор /g выполнит глобальный поиск и замену, а не просто заменит первое совпадение.
C:\>echo abacacda| sed "s/a//g"
bccd
Вы можете получить его с помощью gnuwin32, или вы можете использовать его из cygwin, хотя в этом случае используйте одинарные кавычки, а если используете cygwin, то лучше сделать это из оболочки cygwin, например, bash shell cygwin.
Очевидно, что эти команды могут работать с файлами.
C:\>type a.a
asdf
C:\>
C:\>grep -o a a.a
a
C:\>sed "s/a/z/" a.a
zsdf
C:\>
Или Перл
grep не будет искать и заменять. Sed будет, хотя sed не поддерживает PCRE (по крайней мере, не тот sed, который у меня есть). Другой вариант — perl. Регулярные выражения Perl так же хороши, как PCRE, если не лучше. Посмотрите здесьhttps://stackoverflow.com/questions/4794145/perl-one-liner-like-grepи посмотрите, упоминается ли эта ссылкаPerl для сопоставления с регулярными выражениями в Терминале?см. мой ответ там есть perl-формы grep и sed, и у вас будет отличная поддержка регулярных выражений с perl, очевидно
Если вы посмотрите мой ответ по второй ссылке (как я уже сказал), то увидите, что я сказал, что получил и использовал Perl в Cygwin, а также то, как его можно использовать.