Я хочу программно редактировать содержимое файла с помощью командной строки Windows (cmd.exe). В * nix есть sed для этой задачи. Есть ли какой-нибудь полезный нативный эквивалент в Windows?
Под родным я имел в виду решение, которое работает во всех окнах без установки дополнительных компонентов.
Оставьте cmd.exe и используйте вместо него PowerShell.
Связанный: stackoverflow.com/questions/60034/…
Если вы просто хотите удалить определенные строки из файла, используйте FIND /?
Если вы просто хотите найти и заменить текст в строке или переменной в CMD, вы можете просто выполнить %var:old=new%. См. ss64.com/nt/syntax-replace.html для получения дополнительной информации.





Вы можете установить Cygwin (http://www.cygwin.com/) и использовать оттуда sed.
edlin или редактировать
плюс есть службы Windows для Unix, которые поставляются со многими инструментами unix для Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Обновление 07.12.12 В Windows 2003 R2, Windows 7 и Server 2008 и т. д. Вышеуказанное заменено Подсистемой для приложений на базе UNIX (SUA) в качестве надстройки. Но нужно скачать утилиты: http://www.microsoft.com/en-us/download/details.aspx?id=2391
Оба больше не существуют в 64-битных версиях Windows.
Вы можете посмотреть Инструменты GNU, они предоставляют (среди прочего) sed для окон.
Cygwin работает, но также доступны утилиты эти. Просто поместите их на свой диск, поместите каталог на свой путь, и у вас будет много удобных утилит unix. ИМХО легче Cygwin (хотя он тоже работает).
Насколько я знаю, ничего подобного sed не связано с окнами. Однако sed доступен для Windows в нескольких различных формах, в том числе как часть Cygwin, если вам нужна полная подсистема POSIX, или как собственный исполняемый файл Win32, если вы хотите запустить только sed в командной строке.
Sed для Windows (проект GnuWin32)
Если он должен быть встроен в Windows, единственное, что я могу предложить, - это использовать язык сценариев, поддерживаемый Windows, без надстроек, например VBScript.
Вы можете попробовать PowerShell. Есть встроенные командлеты Get-Content и набор-контент, которые вы можете использовать.
Вероятно, это две вещи в PowerShell, которые меньше всего влияют на то, что делает sed ;-). Оператор -replace, вероятно, лучший вариант.
Я использую Cygwin. Я сталкиваюсь с множеством людей, которые не понимают, что если вы поместите двоичные файлы Cygwin в свой PATH, вы можете использовать их из командной оболочки Windows. Вам не нужно запускать Cygwin's Bash.
Вы также можете изучить Службы Windows для Unix, доступный от Microsoft (но только в Professional и более поздних версиях Windows).
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 - самое легкое решение.
В любом случае большое спасибо и всем остальным за ответы.
GnuWin32 является - родное решение, если под родным вы имеете в виду, разработанное для работы в «нормальной» среде Windows (в отличие от CygWin). Попробуйте, и вы начнете ожидать, что они будут в КАЖДОЙ системе Windows, которую вы используете. !!!
Работает в моем случае! Также не забудьте опцию cscript "// NoLogo".
Если это «нестандартно», поинтересуйтесь, как выглядит ваш другой код! Потрясающе, спасибо.
@dbenham Вы добавляете ссылки на свои собственные сценарии в ответы других людей и формулируете их так, как если бы это было подтверждено? Как это еще что-то, кроме спама?
@hvd - Обычно я не добавляю контент к другим ответам. Однако я думаю, что добавленная информация заслуживает большего, чем комментарий, но не заслуживает отдельного ответа на этот вопрос. Связанная утилита является расширением идей VBS, уже представленных в этом ответе, но реализованной как JScript вместо VBS. Это пример того, как идея может быть «конкретизирована», поэтому я определенно не считаю ее спамом. Но я признаю, что я считал, что некоторые могут возразить, так что это был своего рода эксперимент. Если OP или общее сообщество возражают, я не буду возражать, если он откатится.
@dbenham - мой взгляд на уточнения или производные ответы состоит в том, что они должны быть комментариями, и пусть они получат положительное голосование. Я могу согласиться с тем, что вы считаете это «обновлением», но мне кажется, что вы украли мой ответ. Тем не менее, ваш код интересен, и я посмотрю на него. Итак, я думаю, спасибо. :)
@hvd - Основываясь на понятном мнении Билла, я пересмотрел и отменил свою правку. Это был неудачный эксперимент, поэтому я больше не буду этого делать :) Я только хочу, чтобы откат редактирования был настоящим откатом.
Аналогичную утилиту поиска и замены регулярных выражений можно выполнить с помощью JScript. Преимущество JScript перед VBScript заключается в том, что его можно легко комбинировать с пакетной обработкой в одном сценарии, что упрощает использование утилиты в контексте пакета или командной строки. Доступна надежная гибридная утилита JScript / batch под названием REPL.BAT.. Он имеет множество параметров командной строки. Полная документация встроена в сценарий. У него, конечно, нет полной возможности sed, но даже в этом случае он довольно мощный.
@dbenham - ты джентльмен и ученый. +1 и +1. Мне делать нравится ваше решение jscript, хотя мне нужно время, чтобы его переварить. Очень интересно.
Не работайте, если у вас есть двоичный контент. Прекрасно работает с sed в GnuWin32.
@JoeBilly - Верно, но OP запрашивает собственное решение для командной строки. GnuWin32 sed - нет.
У Chocolatey уже давно есть это: шоколадный.org/packages/sed, который является GNU sed и включает параметр -z / --null-data. Я только что проверил; в настоящее время он устанавливает sed.exe, который в двоичном виде совпадает с github.com/mbuilov/sed-windows/blob/…
Существует Супер Сед - расширенная версия sed. Для Windows это автономный .exe, предназначенный для запуска из командной строки.
Если вы не хотите ничего устанавливать (я предполагаю, что вы хотите добавить сценарий в какое-то решение / программу / и т.д., которые будут запускаться на других машинах), вы можете попробовать создать сценарий 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", но я думаю, что эта более удобна с точки зрения специальных символов ('> </).
Кстати, я этого не писал, но не могу вспомнить, откуда взял.
Сегодня PowerShell меня спас.
Для grep есть:
get-content somefile.txt | where { $_ -match "expression"}
или же
select-string somefile.txt -pattern "expression"
а для sed есть:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Подробнее см. Запись в блоге Заина Набулсиса.
Вдобавок: если вы хотите вызвать его из обычного cmd, просто @powershell -Command "get-content ..." it. Единственное предостережение: вы должны избегать кавычек: ... -Команда "get-content ... \" выражение \ ", ..."
@Tarc AFAIR, вы можете использовать одинарные кавычки в своей команде и использовать двойные кавычки, чтобы заключить команду в кавычки.
Я попробовал это сегодня в файле, чтобы удалить кое-что между кавычками в определенных местах, только чтобы обнаружить, что на выходе получился файл, почти вдвое больший, чем оригинал. Причина заключалась в том, что этот метод изменил способ обработки новых строк в файле, чтобы использовать «\ r \ n» вместо «\ n».
Удвоение из-за \ r \ n будет означать, что ваш файл состоит исключительно из новых строк. Вот настоящая причина: кодирование.
@ Якуб Штурц: есть ли простой способ сделать это sed -i 's/foo/bar/g' *
@ and-bri (Get-Content c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | Set-Content c: \ temp \ test.txt
@phuclv: Спасибо, я обновлю свой ответ.
Попробуйте fart.exe. Это служебная программа поиска и замены текста, которую можно использовать в пакетных программах команд.
http://sourceforge.net/projects/fart-it/
Если я действительно не могу использовать * nix-подобную оболочку, я предпочитаю это, поскольку это небольшой автономный exe без зависимостей.
Мне нужен был инструмент sed, который работал с командной строкой Windows cmd.exe. Перенос sed Эрика Пемента на один файл DOS .exe отлично поработал для меня.
Это неплохо задокументированный.
Вопрос про Окна (cmd.exe) не про DOS
@royhowie: Понятно. Хотя некоторые из этих ответов могут быть кому-то полезны, я согласен с тем, что сам вопрос не совсем подходит для SO. OTOH, я не чувствую себя квалифицированным, чтобы рекомендовать полное удаление.
В этой ситуации, я думаю, было бы сложно включить существенные части ответа, поскольку существенной частью является файл .exe, который размещен на связанной странице. Я полностью понимаю беспокойство по поводу гниения ссылок, я просто не уверен, как я могу сделать это самодостаточным для SO.
Спасибо за улов, a_horse_with_no_name. Я был неаккуратен в своем языке. Я отредактировал свой комментарий, чтобы исправить указанную вами проблему.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Это поведение
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Работает отлично. Примечание: круглые скобки на «get-content» гарантируют, что файл не будет использоваться позже, когда будет вызван «set-content».
возможно ли что-то подобное в cmd? Я понимаю, это только для pwsh
«Исходное регулярное выражение» должно быть заменено любым возможным регулярным выражением? это действительно работает в оболочке питания?
Существует вспомогательный командный файл для 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 из stack overflow и dostips.com
Другой вспомогательный пакетный файл под названием findrepl.bat предоставляет пользователю Windows большую часть возможностей GREP, он также основан на Jscript и также является гибридным пакетным файлом. Он разделяет преимущества repl.bat
Скачать findrepl из - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
Автор - @aacini из stack overflow и dostips.com
Ссылка Dropbox для ответа не работает. У вас есть вторичная ссылка?
Что значит "родной" ??? Устанавливается для работы в cmd.exe или вообще без установки? Если первое, см. Ссылку на GnuWin32 ниже; если последнее, то нет. Нет предустановленного собственного sed для Windows.