Чи є якась така утиліта, як утиліта для cmd.exe? [зачинено]


149

Я хочу програмно редагувати вміст файлів за допомогою командного рядка Windows ( cmd.exe ). У * nix є sed для цих завдань. Чи є корисний нативний еквівалент у Windows?


1
Що ви маєте на увазі під "рідним" ??? Можна встановити для роботи в cmd.exe або працювати без будь-якої інсталяції? Якщо перший, див. GnuWin32 ref'd нижче; якщо останні, ні. Немає попередньо встановленої нативної канавки для вікон.
Майкл Паулуконіс,

6
Під рідним я мав на увазі рішення, яке працює на всіх вікнах, не встановлюючи додаткових матеріалів.
Якуб Штурч

1
Залиште cmd.exe позаду і використовуйте замість нього PowerShell.
Bill_Stewart


Якщо ви просто хочете видалити певні рядки з файлу, скористайтесь ЗНАЙТИ /?
Джон Генкель

Відповіді:


117

Сьогодні повноваження врятували мене.

Бо grepє:

get-content somefile.txt | where { $_ -match "expression"}

або

select-string somefile.txt -pattern "expression"

і бо sedє:

get-content somefile.txt | %{$_ -replace "expression","replace"}

Більш детально див. Запис у блозі Zain Naboulsis .


12
Крім того: якщо ви хочете викликати його з звичайного cmd, просто @powershell -Command "get-content ..." це. Єдине застереження полягає в тому, що ви повинні уникати лапок: ... -Command "get-content ... \"
izraz

1
@Tarc AFAIR, ви можете використовувати одинарні лапки у своїй команді та використовувати подвійні лапки, щоб замість цього процитувати команду

2
Я спробував це сьогодні у файлі, щоб видалити деякі матеріали між цитатами в певних місцях, лише щоб виявити, що вихідний файл був майже вдвічі більшим за оригінал. Причиною стало те, що цей метод змінив спосіб обробки нових рядків у файлі для використання "\ r \ n" замість "\ n".
користувач132278

1
Подвоєння через \ r \ n означало б, що ваш файл складався виключно з нових рядків. Ось справжня причина: кодування .
Аміт Найду

2
@ and-bri (Get-Content c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | Set-Content c: \ temp \ test.txt
AFP_555

94

sed (і його ілк) містяться в декількох пакетах команд Unix.

  • Cygwin працює, але гігантський.
  • UnxUtils набагато стрункіше.
  • GnuWin32 - ще один порт, який працює.
  • Ще одна альтернатива - система UWIN AT&T Research .
  • MSYS від MinGw - це ще один варіант.
  • Підсистема Windows для Linux - це найбільш «рідний» варіант, але він не встановлений у Windows за замовчуванням; він є sed, grepтощо, поза коробкою, хоча.
  • https://github.com/mbuilov/sed-windows пропонує останні версії 4.3 та 4.4, які підтримують -zваріант на відміну від перелічених верхніх портів

Якщо ви не хочете нічого встановлювати, а ваша система не є сервером Windows, тоді ви можете використовувати для цього мову скриптів (VBScript, наприклад). Внизу є груба, не-манжетна удара по ній. Ваш командний рядок виглядав би так

cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt

де oldpat та newpat є шаблонами згенерації регексу Microsoft vbscript . Очевидно, що я реалізував лише команду-замінник і припустив деякі речі, але ви могли б розробити її розумнішою та зрозуміти більше sedкомандного рядка.

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  WScript.Echo rxp.Replace(inp, patparts(2))
Loop

1
Це не зовсім те, що я хочу, проте я заперечую, що залежність від VBS - це найлегше рішення.
Якуб Штурч

7
GnuWin32 - це власне рішення, якщо під рідним ви маєте на увазі розроблений для роботи у "нормальному" середовищі Windows (на відміну від CygWin). Спробуйте їх спробувати, і ви почнете очікувати, що вони будуть у ВСЕМ ОСНІ Windows. !!!
Майкл Паулуконіс,

3
Працює для моєї справи! Крім того, не забувайте параметр cscript "// NoLogo".
Марко Думіч

4
Якщо це "без манжети", поцікавтеся, як виглядає ваш інший код! Дивовижно, дякую.
Сабунку

2
Аналогічну утиліту пошуку та заміни регулярного виразу можна виконати з JScript Перевага JScript над VBScript полягає в тому, що він може легко поєднуватися з пакетною партією в одному сценарії, що полегшує використання утиліти в контексті пакетного чи командного рядка. Доступна надійна гібридна утиліта JScript / пакетна під назвою REPL.BAT . У ньому багато варіантів командного рядка. Повна документація вбудована в сценарій. Це, звичайно, не має повної можливості sed, але, навіть, це досить потужне.
dbenham


17

Якщо ви не хочете нічого встановлювати (я припускаю, що ви хочете додати скрипт у якесь рішення / програму / тощо, яке буде запускатися на інших машинах), ви можете спробувати створити сценарій vbs (скажімо, substitu.vbs):

Const ForReading = 1
Const ForWriting = 2

strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)

strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, strOldText, strNewText)

Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText
objFile.Close

І ви запускаєте це так:

cscript replace.vbs "C:\One.txt" "Robert" "Rob"

Що схоже на версію sed, що надається "законопроектом", але я думаю, що ця є більш доброзичливою з точки зору спеціальних ('> </) символів.

До речі, я цього не писав, але не можу згадати, звідки я це взяв.


10

Існує супер Sed розширена версія СЕД. Для Windows це автономний .exe, призначений для запуску з командного рядка.


8
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt

Це поведінка

sed -i 's/^SourceRegexp$/DestinationString/g' file.txt

1
Це прекрасно працює. Примітка: дужки в "get-content" гарантують, що файл не буде використовуватися пізніше, коли буде викликано "set-content".
Кафу

чи можливо щось подібне в cmd? в розумінні, це лише для pwsh
Ferroao

чи повинен замінити "SourceRegexp" будь-який можливий регулярний вираз? це справді працює в силовій оболонці?
scjorge

7

Ви можете спробувати powerhell. Існують команди get-content та set-content, які можна використовувати.


4
Це, мабуть, дві речі в PowerShell, які щонайменше сприяють тому, що sedробить ;-). -replaceОператор, ймовірно, краще пропозицію.
Джої

7

Спробуйте fart.exe. Це утиліта "Знайти та замінити", яку можна використовувати в пакетних командних програмах.

http://sourceforge.net/projects/fart-it/


Якщо я дійсно не можу використовувати оболонку * nix, я вважаю за краще це, оскільки це невеликий автономний exe без залежностей.
Qben


6

Я використовую Cygwin . Я натрапляю на безліч людей, які не розуміють, що якщо ви помістите бінарні файли Cygwin на свій PATH, ви можете використовувати їх з оболонки Windows Command. Не потрібно запускати Баш Сигвіна.

Ви також можете ознайомитись із службами Windows для Unix, доступними у Microsoft (але лише у професійній та вище версії Windows).


4

Едлін або редагувати

плюс є Windows Services для Unix, яка постачається з багатьма інструментами Unix для Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx

Оновлення 12/7/12 У Windows 2003 R2, Windows 7 & Server 2008 тощо, вищезазначене замінено підсистемою для додатків на основі UNIX (SUA) як доповнення. Але ви повинні завантажити утиліти: http://www.microsoft.com/en-us/download/details.aspx?id=2391


5
Обидві більше не існують у 64-бітних версіях Windows.
Джої


3

Існує помітний пакетний файл для Windows, repl.batякий називається, який має велику здатність SED, але doesn't require any additional downloadабо інсталяції. Це гібридний пакетний файл, який використовується Jscriptдля реалізації функцій, і так swift, і doesn't suffer from the usual poison charactersдля пакетної обробки та легко обробляє порожні рядки.

Завантажити replз - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

Автор @dbenham з переповнення стека та dostips.com

Інший помітний пакетний файл findrepl.batнадає користувачеві Windows багато можливостей, GREPа також ґрунтується Jscriptта є також гібридним пакетним файлом. Він ділиться перевагами repl.bat

Завантажити findreplз - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Автор @aacini з переповнення стека та dostips.com


Посилання "Dropbox" для відбору не працює. У вас є вторинне посилання?
Вішал Ананд

2

Наскільки я не знаю нічого, як sed не в комплекті з вікнами. Однак sed доступний для Windows у декількох різних формах, включаючи частину Cygwin, якщо ви хочете отримати повну підсистему POSIX або як власний виконуваний файл Win32, якщо ви хочете запустити тільки sed у командному рядку.

Sed для Windows (проект GnuWin32)

Якщо він повинен бути рідним для Windows, то єдиним іншим, що я можу запропонувати, буде використання мови сценаріїв, що підтримується Windows без додаткових додатків, таких як VBScript.


1

Cygwin працює, але ці утиліти також доступні. Просто покладіть їх на свій привід, покладіть каталог на свій шлях, і у вас є багато ваших дружніх утиліт Unix. Легка вага IMHO, що Cygwin (хоча це працює так само добре).


0

Мені знадобився інструмент sed, який працював на підказку Windows cmd.exe. Порт Ерік Pement про СЕД на одній DOS EXE - файл працював великий для мене.

Це досить добре задокументовано .


1
Питання стосується Windows (cmd.exe), а не про DOS
a_horse_with_no_name

@royhowie: Я бачу. Хоча деякі з цих відповідей комусь можуть бути корисні, я погоджуюсь, що саме питання не дуже підходить для ЗП. OTOH, я не вважаю кваліфікованим рекомендувати видалення оптом.
PM 2Ring

У цій ситуації я думаю, що важко буде включити істотні частини відповіді, оскільки істотною частиною є файл .exe, розміщений на пов'язаній сторінці. Я повністю розумію стурбованість з приводу гниття зв’язків, я просто не впевнений, як я міг зробити це самодостатнім для SO.
bryan kennedy

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