Я хочу программно редактировать содержимое файла с помощью командной строки Windows (cmd.exe). В * nix для этих задач есть sed. Есть ли полезный эквивалент в окнах?
Изменить: Я ищу встроенное решение командной строки.
Я хочу программно редактировать содержимое файла с помощью командной строки Windows (cmd.exe). В * nix для этих задач есть sed. Есть ли полезный эквивалент в окнах?
Изменить: Я ищу встроенное решение командной строки.
Сегодня powershell спас меня.
Для grep
есть:
get-content somefile.txt | where { $_ -match "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
Если вы не хотите ничего устанавливать (я предполагаю, что вы хотите добавить script в какое-то решение/программу/etc, которое будет запущено на других машинах), вы можете попробовать создать vbs script (позволяет скажем, 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, предоставленную "ткачиком купюр", но я думаю, что этот более дружелюбный с точки зрения специальных символов (' > </).
Кстати, я не писал этого, но не могу вспомнить, откуда я его получил.
Существует Super Sed расширенная версия sed. Для Windows это автономный .exe, предназначенный для запуска из командной строки.
Попробуйте fart.exe. Это утилита Find-and-replace-text, которая может использоваться в командных пакетных программах.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Это поведение
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Вы можете установить Cygwin (http://www.cygwin.com/) и использовать sed оттуда.
Вы можете попробовать powershell. Есть get-content и set-content. Создаются команды которые вы могли бы использовать.
Я использую Cygwin. Я сталкиваюсь с множеством людей, которые не понимают, что если вы ставите бинарные файлы Cygwin на свой PATH, вы можете использовать их из командной оболочки Windows. Вам не нужно запускать Cygwin Bash.
Вы также можете посмотреть Службы Windows для Unix, доступные из Microsoft (но только в Professional и выше для версий Windows).
edlin или редактировать
плюс есть Windows Services for 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 Tools, они обеспечивают (среди прочего) sed на окнах.
Насколько я знаю, ничего подобного sed не связано с окнами. Однако sed доступен для Windows в нескольких разных формах, в том числе в составе Cygwin, если вы хотите полноценную подсистему POSIX или как исполняемый файл Win32, если вы хотите запускать только sed в командной строке.
Sed для Windows (проект GnuWin32)
Если он должен быть родным для Windows, то единственное, что я могу предложить, это использовать язык сценариев, поддерживаемый Windows без надстроек, например VBScript.
Существует вспомогательный пакетный файл для Windows под названием repl.bat
, который имеет большую часть SED, но doesn't require any additional download
или установку. Это гибридный пакетный файл, который использует Jscript
для реализации функций, а также swift
и doesn't suffer from the usual poison characters
пакетной обработки и легко обрабатывает пустые строки.
Загрузить repl
from - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
Автор @dbenham из и dostips.com
Другой вспомогательный пакетный файл с именем findrepl.bat
дает пользователю Windows большую часть возможностей GREP
и также основан на Jscript
и также представляет собой гибридный пакетный файл. Он разделяет преимущества repl.bat
Скачайте findrepl
from - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
Автор @aacini из и dostips.com
Cygwin работает, но эти утилиты также доступны. Просто плюньте их на свой диск, поместите каталог на свой путь, и у вас есть много ваших дружественных утилит unix. Легче ИМХО, что Cygwin (хотя это работает так же хорошо).
Это работает на Vista Ultimate, не уверен насчет Pro.
sed -f commandfilename.cmd file1 > file2
Мне нужен инструмент sed, который работал для командной строки Windows cmd.exe. Порт Eric Pement sed для одного DOS.exe отлично подойдет для меня.
Это довольно хорошо документально.