Regex Замінити з командного рядка


21

Чи можна повторно виразити заміну з командного рядка? Зараз я використовую блокнот ++ для цього. У командному рядку я можу використовувати лише FINDSTR, який може знаходити лише файли / рядки, які кешовані

EDIT:
Може бути, можна створити сценарій VB і запустити його з cmd? Я щойно створив файл "hi.vbs" із вмістом

Msgbox "Hi Buddy"

Потім cmd дозволяє мені запустити його безпосередньо, набравши "привіт" з командного рядка.
Отже, якщо це неможливо з пакетним сценарієм, то я можу використовувати пакетну скрипт VB. Або ..?


В кінці ви ставите непереконливе речення, і вся частина EDIT не вказує на проблему, це більше схоже на "Я створюю привіт світ у vb, чи можу я створити щось подібне в пакеті? Перевірте відповідь, опубліковану @IanPugsley найпростіший спосіб замінити регулярні вирази
mjsr

@Aziz: чи спрацював хтось із цих відповідей? Якщо так, чи приймете ви це? Це частина участі в цій спільноті; як ми дякуємо одне одному за допомогу. Бали репутації, отримані за прийняту відповідь, допомагають іншим користувачам оцінити досвід один одного. Спасибі.
JRobert

Я думав зателефонувати на щось таке, як MYVBREPLACE (.vbs) ЗАМОВЛЕННЯ FILENAME REGEXPATTERN з командного рядка.
Азіз

Відповіді:


11

перейдіть сюди
http://gnuwin32.sourceforge.net/packages.html
прокрутіть униз до СЕД. Завантажте також 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


Дивовижний божевільний інструмент !!! Цей інструмент був занадто прихильним. Я не міг ще нею користуватися, але коли я прочитав gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command, я можу побачити, що це може зробити набагато більше, ніж те, що я міг очікувати. Велике спасибі
Азіз

Нові версії bash також можуть робити регулярні вирази, іноді цього достатньо для простих завдань, і немає потреби використовувати навіть sed.
vtest

і повторіть те, що сказав vtest, на випадок, якщо хтось не знає. cygwin має баш.
барлоп

sed відсмоктує багаторядкові заміни, хоча
kofifus

1
Оболонка cmd @KennyEvitt потребує налаштування, щоб відобразити та використовувати chcp для unicode utf8 chcp 65001 (як ви кажете, utf16 encoding.chcp 1200 та chcp 12001 не підтримується) stackoverflow.com/questions/9321419/… Не впевнений м'ятний. Не впевнений, що знову повноваження. Але utf-8 підтримується нормально в cmd або powerhell. Поки підтримуючий шрифт використовується як courier new, і поки це кодова сторінка 65001. Існує cmd / u для кодування utf16.
барлоп

26

Я написав безкоштовний інструмент командного рядка для Windows для цього. Він називається rxrepl , він підтримує Unicode і пошук файлів. Деякі можуть вважати це корисним інструментом.

rxrepl - це інструмент командного рядка Microsoft Windows для пошуку та заміни тексту в текстових файлах, використовуючи регулярні вирази, сумісні з Perl (PCRE).

Він має такі особливості:

  • Пошук за допомогою регулярних виразів, сумісних з Perl
  • Використовуйте відповідність груп у тексті заміни
  • Підтримує закінчення рядків Windows та Unix
  • Підтримка Unicode
  • Приймає кілька аргументів пошуку / заміни
  • Параметри можуть бути надані у файлі опцій
  • Сканування файлів
  • Режим попереднього перегляду
  • Режими відповідності рядків та повних файлів

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


4
Це дивно! Якщо ви схожі на мене , і потрібні приклади, це замінює "Foobar" з "foofighters" в файлі: rxrepl.exe -f file.txt -a -s "(Foo) бар" -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 немає, ви, мабуть, вже встановлені).

Запустіть його, запустіть наступне (щоб замінити *а @):

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

Це підтримує регулярні вирази .NET , включаючи позитивний та негативний погляд вперед, і всі речі речі блокнота ++ не підтримували регулярний вираз до версії 6.x (наскільки я люблю блокнот ++).


1
Notepad ++ підтримує повний PCRE версії 6.
Боб

5

Я знайшов для цього fnr.exe . Він має графічний інтерфейс та командний рядок.

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

Особливості

  • Завантаження одного файлу - fnr.exe (127kb)
  • Замініть текст у кількох файлах за допомогою програми Windows або через командний рядок
  • Знайти лише, щоб побачити, де знайдено збіги
  • Пошук з урахуванням регістру
  • Пошук файлів в одному каталозі або повторюваних підкаталогів
  • Регулярні вирази
  • Знайдіть і замініть багаторядковий текст
  • Створити кнопку командного рядка, щоб створити текст командного рядка, який слід помістити у пакетний файл
  • Довідка командного рядка
  • Одиничні випробування двигуна "Знайти / замінити"

Перегляд параметрів командного рядка

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


1
Досить приємно - ви можете перевірити свою заяву "знайти" в графічному інтерфейсі, натиснути "Gen Replace Command Line" і приготуватися до використання виклику командного рядка. Не потрібно витрачати час на ознайомлення з синтаксисом командного рядка.
sarh

Мені не вдалося змусити це вийти після внесення змін. Мені потрібно натиснути клавішу Enter, щоб закрити, що робить це не особливо корисним для сценаріїв
G-.

@ G-. Немає очікування <enter>, якщо він запущений з пакетного файлу.
Сергій

Я не зміг знайти спосіб вивести інше ім’я / розширення файлу
Рік

4

Схоже, ви можете використовувати регулярні вирази за допомогою FINDSTR

findstr [Windows CMD] :

findstr дозволяє шукати текст (як зазначено з малюнком у назві файлу файлу. Якщо ім'я файлу містить підстановку (* або?), воно здійснює пошук у всіх файлах, які відповідають. Параметр / S здійснює пошук у поточному каталозі, а також Якщо в шаблоні містяться пробіли, він повинен бути вказаний як so / 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

Дякую за вашу відповідь, але це не було моїм питанням.
Азіз

2
findstrне вдається замінити текст у файлах!
Кенні Евітт

4

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

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

JREPL використовує стандартний регулярний вираз ECMA, що постачається з JScript. Регекс ECMA не настільки потужний, як .NET-регулярний вираз, доступний для shellshell, але він все ще досить проклятий. І я думаю, що середньому користувачеві ця утиліта стане простішою у використанні, ніж посилання shell.

Вбудовані параметри JREPL вже забезпечують багато властивої енергії, але можливість вводити JScript, що надається користувачем, дійсно відкриває дивовижні можливості.

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

Просто перейдіть за посиланням та скопіюйте код скрипту у файл під назвою JREPL.BAT. Прочитайте наступні публікації з цієї теми для прикладів використання та історії розвитку. Існує також багато відповідей StackOverflow, які використовують JREPL.BAT.


3

Два хороших варіанти - це Cygwin, який дасть вам схоже на Unix середовище, схоже на баш (альтернатива cmd.exe); і порти Unxutils , Win32 колекції окремих утиліт. В будь-якому пакеті див. "Sed", "awk" та "grep".


2
unxutils стара. тепер річ gnuwin32
барлоп

Дякую, Джорберт за вашу пропозицію. Вибачте, що я цього не зробив, але тепер я можу побачити, що SED - це річ.
Азіз

@barlop станом на 2018 рік, gnuwin32 тепер теж старий .. cygwin є більш сучасним!
барлоп

0

Ви також можете використовувати GSAR для здійснення пошуку та заміни командного рядка. Працює і з шестигранними, і з бінарними. Він не виконає складний важкий підйом, який може виконати регулярний вираз, але для основного пошуку та заміни він виконує цю роботу швидко та легко.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.