Я хочу программно редактировать содержимое файла с помощью командной строки Windows ( cmd.exe ). В * nix есть sed для этой задачи. Есть ли полезный родной эквивалент в Windows?
Я хочу программно редактировать содержимое файла с помощью командной строки Windows ( cmd.exe ). В * nix есть sed для этой задачи. Есть ли полезный родной эквивалент в Windows?
Ответы:
Сегодня PowerShell спас меня.
Ибо 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 Server, тогда вы можете использовать для этого язык сценариев (например, 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 (скажем, replace.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, предоставляемую «bill weaver», но я думаю, что эта версия более дружелюбна с точки зрения специальных ('> </) символов.
Кстати, я не писал это, но я не могу вспомнить, откуда я это взял.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Это поведение
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Вы можете попробовать PowerShell. Есть встроенные командлеты get-content и set-content, которые вы можете использовать.
sed
делает ;-). -replace
Оператор, вероятно, лучше предложение.
Попробуйте fart.exe. Это утилита поиска и замены текста, которую можно использовать в пакетных программах команд.
Вы можете установить Cygwin ( http://www.cygwin.com/ ) и использовать оттуда sed.
Я использую Cygwin . Я сталкиваюсь со многими людьми, которые не понимают, что если вы поместите двоичные файлы Cygwin в PATH, вы сможете использовать их из командной оболочки Windows. Вам не нужно запускать Cygwin's Bash.
Вы также можете посмотреть на службы Windows для Unix, доступные от Microsoft (но только в Профессиональной и более поздних версиях Windows).
редактировать или редактировать
Кроме того, есть службы Windows для 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
Существует вспомогательный командный файл для 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. Порт sed Эрика Пимента в один DOS .exe отлично работал для меня.
Это довольно хорошо задокументировано .