Есть ли утилита sed для cmd.exe?

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

Что значит "родной" ??? Устанавливается для работы в cmd.exe или вообще без установки? Если первое, см. Ссылку на GnuWin32 ниже; если последнее, то нет. Нет предустановленного собственного sed для Windows.

Michael Paulukonis 26.05.2009 17:10

Под родным я имел в виду решение, которое работает во всех окнах без установки дополнительных компонентов.

Jakub Šturc 26.05.2009 21:34

Оставьте cmd.exe и используйте вместо него PowerShell.

Bill_Stewart 01.01.2015 17:59

Связанный: stackoverflow.com/questions/60034/…

AlikElzin-kilaka 26.11.2015 19:11

Если вы просто хотите удалить определенные строки из файла, используйте FIND /?

John Henckel 25.04.2016 16:04

Если вы просто хотите найти и заменить текст в строке или переменной в CMD, вы можете просто выполнить %var:old=new%. См. ss64.com/nt/syntax-replace.html для получения дополнительной информации.

wisbucky 28.03.2018 02:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
162
6
230 959
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Вы можете установить 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.

Joey 21.04.2010 12:51

Вы можете посмотреть Инструменты GNU, они предоставляют (среди прочего) sed для окон.

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

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

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

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

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

Вы можете попробовать PowerShell. Есть встроенные командлеты Get-Content и набор-контент, которые вы можете использовать.

Вероятно, это две вещи в PowerShell, которые меньше всего влияют на то, что делает sed ;-). Оператор -replace, вероятно, лучший вариант.

Joey 21.04.2010 12:51

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

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

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

  • Cygwin работает, но гигантский.
  • UnxUtils намного тоньше.
  • GnuWin32 - еще один работающий порт.
  • Другой альтернативой является Система UWIN от AT&T Research.
  • 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

Это не совсем то, что я хочу, но я считаю, что зависимость от VBS - самое легкое решение.

Jakub Šturc 24.09.2008 20:08

В любом случае большое спасибо и всем остальным за ответы.

Jakub Šturc 24.09.2008 20:16

GnuWin32 является - родное решение, если под родным вы имеете в виду, разработанное для работы в «нормальной» среде Windows (в отличие от CygWin). Попробуйте, и вы начнете ожидать, что они будут в КАЖДОЙ системе Windows, которую вы используете. !!!

Michael Paulukonis 26.05.2009 17:09

Работает в моем случае! Также не забудьте опцию cscript "// NoLogo".

Marko Dumic 21.06.2010 18:38

Если это «нестандартно», поинтересуйтесь, как выглядит ваш другой код! Потрясающе, спасибо.

Sabuncu 14.07.2011 11:10

@dbenham Вы добавляете ссылки на свои собственные сценарии в ответы других людей и формулируете их так, как если бы это было подтверждено? Как это еще что-то, кроме спама?

user743382 25.09.2013 21:08

@hvd - Обычно я не добавляю контент к другим ответам. Однако я думаю, что добавленная информация заслуживает большего, чем комментарий, но не заслуживает отдельного ответа на этот вопрос. Связанная утилита является расширением идей VBS, уже представленных в этом ответе, но реализованной как JScript вместо VBS. Это пример того, как идея может быть «конкретизирована», поэтому я определенно не считаю ее спамом. Но я признаю, что я считал, что некоторые могут возразить, так что это был своего рода эксперимент. Если OP или общее сообщество возражают, я не буду возражать, если он откатится.

dbenham 25.09.2013 22:01

@dbenham - мой взгляд на уточнения или производные ответы состоит в том, что они должны быть комментариями, и пусть они получат положительное голосование. Я могу согласиться с тем, что вы считаете это «обновлением», но мне кажется, что вы украли мой ответ. Тем не менее, ваш код интересен, и я посмотрю на него. Итак, я думаю, спасибо. :)

b w 26.09.2013 18:42

@hvd - Основываясь на понятном мнении Билла, я пересмотрел и отменил свою правку. Это был неудачный эксперимент, поэтому я больше не буду этого делать :) Я только хочу, чтобы откат редактирования был настоящим откатом.

dbenham 26.09.2013 19:53

Аналогичную утилиту поиска и замены регулярных выражений можно выполнить с помощью JScript. Преимущество JScript перед VBScript заключается в том, что его можно легко комбинировать с пакетной обработкой в ​​одном сценарии, что упрощает использование утилиты в контексте пакета или командной строки. Доступна надежная гибридная утилита JScript / batch под названием REPL.BAT.. Он имеет множество параметров командной строки. Полная документация встроена в сценарий. У него, конечно, нет полной возможности sed, но даже в этом случае он довольно мощный.

dbenham 26.09.2013 19:54

@dbenham - ты джентльмен и ученый. +1 и +1. Мне делать нравится ваше решение jscript, хотя мне нужно время, чтобы его переварить. Очень интересно.

b w 26.09.2013 21:41

Не работайте, если у вас есть двоичный контент. Прекрасно работает с sed в GnuWin32.

JoeBilly 02.04.2014 12:53

@JoeBilly - Верно, но OP запрашивает собственное решение для командной строки. GnuWin32 sed - нет.

b w 02.04.2014 19:57

У Chocolatey уже давно есть это: шоколадный.org/packages/sed, который является GNU sed и включает параметр -z / --null-data. Я только что проверил; в настоящее время он устанавливает sed.exe, который в двоичном виде совпадает с github.com/mbuilov/sed-windows/blob/…

Jeroen Wiert Pluimers 17.07.2019 11:58

Существует Супер Сед - расширенная версия 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 25.07.2014 23:13

@Tarc AFAIR, вы можете использовать одинарные кавычки в своей команде и использовать двойные кавычки, чтобы заключить команду в кавычки.

user719662 13.04.2016 19:15

Я попробовал это сегодня в файле, чтобы удалить кое-что между кавычками в определенных местах, только чтобы обнаружить, что на выходе получился файл, почти вдвое больший, чем оригинал. Причина заключалась в том, что этот метод изменил способ обработки новых строк в файле, чтобы использовать «\ r \ n» вместо «\ n».

user132278 26.09.2016 04:16

Удвоение из-за \ r \ n будет означать, что ваш файл состоит исключительно из новых строк. Вот настоящая причина: кодирование.

Amit Naidu 08.10.2016 04:20

@ Якуб Штурц: есть ли простой способ сделать это sed -i 's/foo/bar/g' *

and-bri 30.04.2018 18:49

@ and-bri (Get-Content c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | Set-Content c: \ temp \ test.txt

AFP_555 03.05.2019 18:44

почему бы просто не использовать get-content | where вместо select-string?

phuclv 28.11.2019 14:03

@phuclv: Спасибо, я обновлю свой ответ.

Jakub Šturc 28.11.2019 14:21

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

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

Если я действительно не могу использовать * nix-подобную оболочку, я предпочитаю это, поскольку это небольшой автономный exe без зависимостей.

Qben 01.10.2012 16:32

Мне нужен был инструмент sed, который работал с командной строкой Windows cmd.exe. Перенос sed Эрика Пемента на один файл DOS .exe отлично поработал для меня.

Это неплохо задокументированный.

Вопрос про Окна (cmd.exe) не про DOS

a_horse_with_no_name 01.01.2015 11:51

@royhowie: Понятно. Хотя некоторые из этих ответов могут быть кому-то полезны, я согласен с тем, что сам вопрос не совсем подходит для SO. OTOH, я не чувствую себя квалифицированным, чтобы рекомендовать полное удаление.

PM 2Ring 01.01.2015 12:30

В этой ситуации, я думаю, было бы сложно включить существенные части ответа, поскольку существенной частью является файл .exe, который размещен на связанной странице. Я полностью понимаю беспокойство по поводу гниения ссылок, я просто не уверен, как я могу сделать это самодостаточным для SO.

bryan kennedy 01.01.2015 17:52

Спасибо за улов, a_horse_with_no_name. Я был неаккуратен в своем языке. Я отредактировал свой комментарий, чтобы исправить указанную вами проблему.

bryan kennedy 01.01.2015 17:53

> (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».

Kafu 24.05.2017 20:48

возможно ли что-то подобное в cmd? Я понимаю, это только для pwsh

Ferroao 09.01.2020 14:27

«Исходное регулярное выражение» должно быть заменено любым возможным регулярным выражением? это действительно работает в оболочке питания?

scjorge 27.02.2020 19:40

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

Vishal Anand 03.04.2019 20:43

Другие вопросы по теме