Я хочу програмно редагувати вміст файлів за допомогою командного рядка Windows ( cmd.exe ). У * nix є sed для цих завдань. Чи є корисний нативний еквівалент у Windows?
Я хочу програмно редагувати вміст файлів за допомогою командного рядка Windows ( cmd.exe ). У * nix є sed для цих завдань. Чи є корисний нативний еквівалент у Windows?
Відповіді:
Сьогодні повноваження врятували мене.
Бо grep
є:
get-content somefile.txt | where { $_ -match "expression"}
або
select-string somefile.txt -pattern "expression"
і бо sed
є:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Більш детально див. Запис у блозі Zain Naboulsis .
sed
(і його ілк) містяться в декількох пакетах команд Unix.
sed
, grep
тощо, поза коробкою, хоча.-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
Якщо ви не хочете нічого встановлювати (я припускаю, що ви хочете додати скрипт у якесь рішення / програму / тощо, яке буде запускатися на інших машинах), ви можете спробувати створити сценарій 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, що надається "законопроектом", але я думаю, що ця є більш доброзичливою з точки зору спеціальних ('> </) символів.
До речі, я цього не писав, але не можу згадати, звідки я це взяв.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Це поведінка
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Ви можете спробувати powerhell. Існують команди get-content та set-content, які можна використовувати.
sed
робить ;-). -replace
Оператор, ймовірно, краще пропозицію.
Спробуйте fart.exe. Це утиліта "Знайти та замінити", яку можна використовувати в пакетних командних програмах.
Ви можете встановити Cygwin ( http://www.cygwin.com/ ) і використовувати sed звідти.
Я використовую Cygwin . Я натрапляю на безліч людей, які не розуміють, що якщо ви помістите бінарні файли Cygwin на свій PATH, ви можете використовувати їх з оболонки Windows Command. Не потрібно запускати Баш Сигвіна.
Ви також можете ознайомитись із службами Windows для Unix, доступними у Microsoft (але лише у професійній та вище версії Windows).
Едлін або редагувати
плюс є 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
Ви можете подивитися на інструменти GNU , вони надають (крім усього іншого) sed на вікна.
Існує помітний пакетний файл для 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
Наскільки я не знаю нічого, як sed не в комплекті з вікнами. Однак sed доступний для Windows у декількох різних формах, включаючи частину Cygwin, якщо ви хочете отримати повну підсистему POSIX або як власний виконуваний файл Win32, якщо ви хочете запустити тільки sed у командному рядку.
Sed для Windows (проект GnuWin32)
Якщо він повинен бути рідним для Windows, то єдиним іншим, що я можу запропонувати, буде використання мови сценаріїв, що підтримується Windows без додаткових додатків, таких як VBScript.
Мені знадобився інструмент sed, який працював на підказку Windows cmd.exe. Порт Ерік Pement про СЕД на одній DOS EXE - файл працював великий для мене.
Це досить добре задокументовано .