Есть ли подобная утилита для cmd.exe? [закрыто]


149

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


1
Что вы подразумеваете под "родным" ??? Устанавливается для работы в cmd.exe или для работы без установки вообще? Если первое, см. GnuWin32 ref'd ниже; если последнее, нет. Нет предустановленного родного седа для windows.
Майкл Паукуонис

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

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


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

Ответы:


117

Сегодня 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 .


12
Кроме того: если вы хотите вызвать его из обычного cmd, просто @powershell -Command "get-content ...". Единственное предостережение заключается в том, что вы должны избегать кавычек: ... -Command "get-content ... \" expression \ ", ..."
Tarc

1
@Tarc AFAIR, вы можете использовать одинарные кавычки в вашей команде и использовать двойные кавычки вместо этой команды

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

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

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

95

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

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

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

3
Работает для моего случая! Кроме того, не забудьте опцию "// NoLogo" cscript.
Марко Думик

4
Если это не так, подумайте, как выглядит ваш другой код! Удивительно, спасибо.
Сабунку

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


17

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

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


10

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


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

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

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

1
Работает отлично. Примечание: круглые скобки в «get-content» гарантируют, что файл не будет использоваться позже, когда будет вызван «set-content».
Кафу

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

должен ли SourceRegexp быть заменен любым возможным регулярным выражением? это действительно работает в Power Shell?
scjorge

7

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


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

7

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

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


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


6

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

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


4

редактировать или редактировать

Кроме того, есть службы 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


5
И то, и другое больше не существует в 64-битных версиях Windows.
Джои


3

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


Ссылка на дропбокс для repl недоступна. У вас есть дополнительная ссылка?
Вишал Ананд

2

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

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

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


1

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


0

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

Это довольно хорошо задокументировано .


1
Вопрос о Windows (cmd.exe), а не о DOS
a_horse_with_no_name

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

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

Спасибо за улов, a_horse_with_no_name. Я был неаккуратен с моим языком. Я отредактировал свой комментарий, чтобы исправить указанную вами проблему.
Брайан Кеннеди
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.