Regex Replace из командной строки

21

Можно ли регулярное выражение заменить из командной строки? Прямо сейчас я использую notepad ++, чтобы сделать это. В командной строке я могу использовать только FINDSTR, который может найти только сопоставленные файлы / строки.

РЕДАКТИРОВАТЬ:
Может быть, удастся создать скрипт VB и запустить его из cmd? Я только что создал файл "hi.vbs" с содержанием

Msgbox "Hi Buddy"

Затем cmd позволяет мне запустить его, набрав «hi» из командной строки.
Так что, если это невозможно с пакетным сценарием, то я могу использовать пакетный сценарий VB. Или..?

Азиз
источник
В конце вы ставите неокончательное предложение, и вся часть EDIT не указывает на проблему, это больше похоже на «Я создаю привет мир в vb, могу ли я создать что-то подобное в пакетном режиме? Проверьте ответ @IanPugsley, является ли простой способ сделать regex-replace
mjsr
@Aziz: любой из этих ответов сработал для вас? Если это так, вы бы приняли это? Это часть участия в этом сообществе; как мы благодарим друг друга за помощь. Баллы репутации, полученные за принятый ответ, помогают другим пользователям оценивать опыт друг друга. Благодарю.
JRobert
Я думал вызвать что-то вроде MYVBREPLACE (.vbs) FILENAME REGEXPATTERN REPLACEMENT из командной строки.
Азиз

Ответы:

11

перейдите сюда
http://gnuwin32.sourceforge.net/packages.html
прокрутите вниз до SED. Скачайте coreutils тоже, пока вы на нем.

эта команда заменит a на b глобально и в каждой строке. так что не только первое вхождение на линии.

например, используя sed "s / a / b / g" a.txt

C:\>type a.txt
aaaa
aaa

C:\>sed "s/a/b/" a.txt
baaa
baa

C:\>sed "s/a/b/g" a.txt
bbbb
bbb

C:\>

VBScript поддерживает регулярные выражения, вы можете найти и заменить его.

dim re, s
set re = new RegExp

re.Pattern="in"
re.Global=True 'false is default
s="bin din in"
MsgBox re.Replace(s,"xxx")

Отображает bxxx dxxx xxx

barlop
источник
Удивительный сумасшедший инструмент !!! Этот инструмент был слишком продвинут. Мне пока не удавалось использовать его, но когда я прочитал gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command, я вижу, что это может сделать намного больше, чем я мог ожидать. Большое спасибо
Азиз
Новые версии bash также могут выполнять регулярные выражения, иногда этого достаточно для простых задач, и нет необходимости использовать даже sed.
Вторник
и еще раз, что сказал vtest, на случай, если кто-то не знает. У Cygwin есть Bash.
Барлоп
sed отстой с многострочными
заменами,
1
Для оболочки @KennyEvitt cmd требуется настройка для отображения и использования chcp для unicode utf8 chcp 65001 (как вы говорите, utf16 encoding.chcp 1200 и chcp 12001 не поддерживаются) stackoverflow.com/questions/9321419/… Не уверен, что mintty. Не уверен, что PowerShell. Но utf-8 поддерживается нормально в cmd или powershell. Пока поддерживающий шрифт используется как новый курьер, и пока это кодовая страница 65001. Для кодировки utf16 есть cmd / u.
17
26

Я написал бесплатный инструмент командной строки для Windows, чтобы сделать это. Он называется rxrepl , он поддерживает Unicode и поиск файлов. Некоторые могут найти это полезным инструментом.

rxrepl - это инструмент командной строки Microsoft Windows для поиска и замены текста в текстовых файлах с использованием Perl-совместимых регулярных выражений (PCRE).

Он имеет следующие особенности:

  • Поиск с использованием Perl-совместимых регулярных выражений
  • Использовать сопоставление группы в тексте замены
  • Поддерживает окончания строк Windows и Unix
  • Поддержка юникода
  • Принимает несколько аргументов поиска / замены
  • Опции могут быть предоставлены в файле опций
  • Сканирование файлов
  • Режим предварительного просмотра
  • Линейный и полный режим сопоставления файлов

введите описание изображения здесь

user2005187
источник
4
Это потрясающе! Если вы похожи на меня и вам нужны примеры, это заменяет "foobar" на "foofighters" в файле: rxrepl.exe -f file.txt -a -s "(foo) bar" -r "\ 1fighters"
Dunc
1
Кроме того, у вас есть источник на github? Совершенно понятно, если это не предназначено для открытого исходного кода, но мне очень любопытно.
kayleeFrye_onDeck
1
@ Steztric Правда? У меня 64-битные окна, и, похоже, у меня нет проблем с этимC:\WINDOWS\System32\cmd.exe
kayleeFrye_onDeck
1
Отличный инструмент! Работает без проблем под Windows Server Std 2012 R2 x64. Спасибо!
kwrl
2
Отличный инструмент, надеюсь, вы до сих пор его поддерживаете
водянистый
12

Сценарист рассказывает, как это сделать в PowerShell (нет дополнительных загрузок на последних версиях ОС Windows, возможно, он уже установлен).

Запустите его, запустите следующее (чтобы заменить *a @):

(Get-Content C:\Scripts\Test.txt) | 
Foreach-Object {$_ -replace "\*", "@"} | 
Set-Content C:\Scripts\Test.txt

Это поддерживает регулярные выражения .NET , включая положительный и отрицательный упреждения, и все, что Notepad ++ не поддерживал с регулярным выражением до версии 6.x (насколько я люблю notepad ++).

Ян Пагсли
источник
1
Notepad ++ поддерживает полный PCRE начиная с версии 6.
Боб,
5

Я нашел fnr.exe для этого. Имеет графический интерфейс и командную строку.

Инструмент с открытым исходным кодом для поиска и замены текста в нескольких файлах.

Характеристики

  • Загрузка одного файла - fnr.exe (127 КБ)
  • Заменить текст в нескольких файлах с помощью приложения Windows или через командную строку
  • Найти только, чтобы увидеть, где найдены совпадения
  • Поиск с учетом регистра
  • Поиск файлов в одном каталоге или повторяющихся подкаталогах
  • Регулярные выражения
  • Найти и заменить многострочный текст
  • Создать кнопку командной строки для создания текста командной строки для помещения в командный файл
  • Справка командной строки
  • Модульные тесты поиска / замены двигателя

Просмотр параметров командной строки

введите описание изображения здесь

Сергий
источник
1
Довольно приятно - вы можете проверить свой оператор «find» в графическом интерфейсе, нажать «Gen Replace Command Line» и получить готовый вызов из командной строки. Не нужно тратить время на знакомство с синтаксисом командной строки.
Sarh
Мне не удалось заставить это выйти после внесения изменений. Я должен нажать Enter, чтобы закрыть, делая это не особенно полезным для сценариев
G-.
@ГРАММ-. <Enter> не ожидается, если он запускается из пакетного файла.
Сергий
Я не смог найти способ вывода на другое имя файла / расширение
Рик
4

Похоже, вы можете использовать регулярные выражения с FINDSTR

findstr [Windows CMD] :

findstr позволяет искать текст (как указано в шаблоне в имени файла file. Если file-name содержит символы подстановки (* или?), он выполняет поиск во всех совпадающих файлах. Параметр / S выполняет поиск в текущем каталоге, а также в его подкаталогах. Если шаблон содержит пробелы, он должен быть указан следующим образом: / C: «некоторый текст для поиска». Чтобы превратить шаблон в регулярные выражения, необходимо использовать параметр / R. Параметр / I ищет регистр нечувствительны.

Из справки FindStr ( Findstr /?):

/ R - использовать строки поиска как регулярные выражения.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word
p0rkjello
источник
Спасибо за ваш ответ, но это был не мой вопрос.
Азиз
2
findstrне может заменить текст в файлах!
Кенни Эвитт
4

Я немного опаздываю на вечеринку, но JREPL.BAT - это гибридная утилита регулярных выражений на основе JScript / batch-сценариев, которая работает на любом компьютере под управлением Windows начиная с XP.

Полная документация встроена в сценарий, который может быть доступен через JREPL /?, или используйте JREPL /??для страничного вывода.

JREPL использует стандартное регулярное выражение ECMA, которое поставляется с JScript. Регулярное выражение ECMA не так мощно, как регулярное выражение .NET, доступное для powershell, но все равно чертовски хорошо. И я думаю, что обычный пользователь найдет эту утилиту проще в использовании, чем powershell.

Встроенные параметры JREPL уже предоставляют массу возможностей, но возможность внедрить пользовательский JScript действительно открывает удивительные возможности.

Я разработал сценарий, потому что мое рабочее место не позволяет загружать нестандартные исполняемые файлы, но не имеет ограничений на написание пакетных или JScript-скриптов :-)

Просто перейдите по ссылке и скопируйте код скрипта в файл с именем JREPL.BAT. Прочитайте последующие посты из этой ветки для примеров использования и истории развития. Есть также много ответов StackOverflow, которые используют JREPL.BAT.

dbenham
источник
3

Два хороших варианта - либо Cygwin, который предоставит вам Unix-подобную, bash-подобную среду (альтернативу cmd.exe); и Unxutils , Win32 порты из набора отдельных утилит Unix. В любом из пакетов смотрите «sed», «awk» и «grep».

JRobert
источник
2
unxutils старый. теперь дело в gnuwin32
barlop
Спасибо JRobert за ваше предложение. Извините, что я не поняла это, но теперь я вижу, что SED был вещь.
Азиз
@ barlop с 2018 года, gnuwin32 теперь тоже старый .. cygwin более современен!
Бароп
0

Вы также можете использовать GSAR для поиска и замены в командной строке. Работает с шестнадцатеричным и двоичным, а также. Он не будет выполнять сложную работу, которую может выполнять регулярное выражение, но для базового поиска и замены он выполняет работу быстро и легко.

солнце
источник