Я хочу програмно редагувати вміст файлів за допомогою командного рядка 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 - файл працював великий для мене.
Це досить добре задокументовано .