Desejo editar programaticamente o conteúdo do arquivo usando a linha de comando do Windows ( cmd.exe ). No * nix, existe sed para essas tarefas. Existe algum equivalente nativo útil no Windows?
Desejo editar programaticamente o conteúdo do arquivo usando a linha de comando do Windows ( cmd.exe ). No * nix, existe sed para essas tarefas. Existe algum equivalente nativo útil no Windows?
Respostas:
Hoje o PowerShell me salvou.
Pois grep
existe:
get-content somefile.txt | where { $_ -match "expression"}
ou
select-string somefile.txt -pattern "expression"
e porque sed
existe:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Para mais detalhes, consulte a entrada do blog de Zain Naboulsis .
sed
(e seu ilk) estão contidos em vários pacotes de comandos do Unix.
sed
, grep
etc. fora da caixa, no entanto.-z
opção diferente das portas superiores listadasSe você não deseja instalar qualquer coisa e seu sistema não é um Windows Server um, então você pode usar uma linguagem de script (VBScript por exemplo) para isso. Abaixo está uma facada nojenta. Sua linha de comando se pareceria
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
onde oldpat e newpat são padrões de regex do Microsoft vbscript . Obviamente, eu apenas implementei o comando substituto e assumi algumas coisas, mas você poderia torná-lo mais inteligente e entender melhor a sed
linha de comando.
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
O UnxUtils fornece sed para o Win32, assim como o GNUWin32 .
Se você não quiser instalar nada (suponho que você queira adicionar o script em alguma solução / programa / etc que será executado em outras máquinas), tente criar um script vbs (digamos, 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
E você executa assim:
cscript replace.vbs "C:\One.txt" "Robert" "Rob"
O que é semelhante à versão sed fornecida pelo "bill weaver", mas acho que essa é mais amigável em termos de caracteres especiais ('> </).
Btw, eu não escrevi isso, mas não me lembro de onde eu consegui.
Há Super Sed, uma versão aprimorada do sed. Para o Windows, este é um .exe independente, destinado à execução na linha de comando.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Esse é o comportamento de
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Você pode tentar o PowerShell. Existem comandoslet get-content e set-content que você pode usar.
sed
faz ;-). O -replace
operador é provavelmente uma sugestão melhor.
Tente fart.exe. É um utilitário Localizar e substituir texto que pode ser usado em programas em lote de comandos.
Você pode instalar o Cygwin ( http://www.cygwin.com/ ) e usar o sed a partir daí.
Eu uso Cygwin . Eu encontro muitas pessoas que não percebem que, se você colocar os binários Cygwin no PATH, poderá usá-los no shell de comando do Windows. Você não precisa executar o Cygwin's Bash.
Você também pode procurar no Windows Services for Unix disponível na Microsoft (mas apenas nas versões Professional e superior do Windows).
edlin ou editar
além disso, há o Windows Services for Unix, que vem com muitas ferramentas unix para Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Atualização 12/7/12 No Windows 2003 R2, Windows 7 e Server 2008, etc., o acima é substituído pelo Subsistema para aplicativos baseados em UNIX (SUA) como um complemento. Mas você precisa baixar os utilitários: http://www.microsoft.com/en-us/download/details.aspx?id=2391
Existe um arquivo de lote auxiliar para o Windows chamado repl.bat
que possui grande capacidade do SED, mas doesn't require any additional download
ou instalação. É um arquivo de lote híbrido que utiliza Jscript
para implementar os recursos e assim é swift
, e doesn't suffer from the usual poison characters
de processamento em lote e alças linhas em branco com facilidade.
Download repl
de - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
O autor é @dbenham do stack overflow e dostips.com
Outro arquivo de lote auxiliar chamado findrepl.bat
fornece ao usuário do Windows grande parte da capacidade GREP
e também é baseado emJscript
e também é um arquivo em lote híbrido. Ele compartilha os benefícios do repl.bat
Download findrepl
de - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
O autor é @aacini do estouro de pilha e dostips.com
Tanto quanto eu sei, nada como sed está empacotado com janelas. No entanto, o sed está disponível para Windows em várias formas diferentes, incluindo como parte do Cygwin, se você deseja um subsistema POSIX completo ou como um executável nativo do Win32, se você deseja executar apenas o sed na linha de comando.
Sed para Windows (Projeto GnuWin32)
Se precisar ser nativo do Windows, a única outra coisa que posso sugerir seria usar uma linguagem de script suportada pelo Windows sem complementos, como o VBScript.
Eu precisava de uma ferramenta sed que funcionasse para o prompt do cmd.exe do Windows. A porta de sed de Eric Pement para um único .exe do DOS funcionou muito bem para mim.
Está muito bem documentado .