Есть ли какая-нибудь утилита для cmd.exe?

Я хочу программно редактировать содержимое файла с помощью командной строки Windows (cmd.exe). В * nix для этих задач есть sed. Есть ли полезный эквивалент в окнах?

Изменить: Я ищу встроенное решение командной строки.

Ответ 1

Сегодня powershell спас меня.

Для grep есть:

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

а для sed:

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

Подробнее см. запись в блоге Zain Naboulsis.

Ответ 2

sed (и тому подобное) содержится в нескольких пакетах команд Unix.

  • Cygwin работает, но гигантский.
  • UnxUtils намного стройнее.
  • GnuWin32 - еще один порт, который работает.
  • Другой альтернативой является система AT & T Research UWIN.
  • MSYS от MinGw - еще один вариант.
  • Подсистема Windows для Linux является наиболее "родной" опцией, но по умолчанию она не установлена в Windows; хотя у него есть sed, grep и т.д. из коробки.
  • https://github.com/mbuilov/sed-windows предлагает последние версии 4.3 и 4.4, которые поддерживают -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

Ответ 3

UnxUtils предоставляет sed для Win32, как и GNUWin32.

Ответ 4

Если вы не хотите ничего устанавливать (я предполагаю, что вы хотите добавить 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, предоставленную "ткачиком купюр", но я думаю, что этот более дружелюбный с точки зрения специальных символов (' > </).

Кстати, я не писал этого, но не могу вспомнить, откуда я его получил.

Ответ 5

Существует Super Sed расширенная версия sed. Для Windows это автономный .exe, предназначенный для запуска из командной строки.

Ответ 6

Попробуйте fart.exe. Это утилита Find-and-replace-text, которая может использоваться в командных пакетных программах.

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

Ответ 7

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

Это поведение

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

Ответ 8

Вы можете установить Cygwin (http://www.cygwin.com/) и использовать sed оттуда.

Ответ 9

Вы можете попробовать powershell. Есть get-content и set-content. Создаются команды которые вы могли бы использовать.

Ответ 10

Я использую Cygwin. Я сталкиваюсь с множеством людей, которые не понимают, что если вы ставите бинарные файлы Cygwin на свой PATH, вы можете использовать их из командной оболочки Windows. Вам не нужно запускать Cygwin Bash.

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

Ответ 11

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

Ответ 12

Вы можете посмотреть GNU Tools, они обеспечивают (среди прочего) sed на окнах.

Ответ 13

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

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

Если он должен быть родным для Windows, то единственное, что я могу предложить, это использовать язык сценариев, поддерживаемый Windows без надстроек, например VBScript.

Ответ 14

Существует вспомогательный пакетный файл для 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

Ответ 15

Cygwin работает, но эти утилиты также доступны. Просто плюньте их на свой диск, поместите каталог на свой путь, и у вас есть много ваших дружественных утилит unix. Легче ИМХО, что Cygwin (хотя это работает так же хорошо).

Ответ 16

Это работает на Vista Ultimate, не уверен насчет Pro.

sed -f commandfilename.cmd file1 > file2