Existe algum sed como utilitário para cmd.exe? [fechadas]


149

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?


1
O que você quer dizer com "nativo" ??? Instalável para funcionar no cmd.exe ou para trabalhar sem instalação? Se o primeiro, consulte o GnuWin32 ref'd abaixo; se o último, não. Nenhum sed nativo pré-instalado para Windows.
Michael Paulukonis

6
Por nativo, quis dizer solução que roda em todas as janelas sem instalar coisas adicionais.
26269 Jakub Šturc

1
Deixe o cmd.exe para trás e use o PowerShell.
Bill_Stewart


Se você deseja excluir determinadas linhas de um arquivo, use FIND /?
31716 John Henckel

Respostas:


117

Hoje o PowerShell me salvou.

Pois grepexiste:

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

ou

select-string somefile.txt -pattern "expression"

e porque sedexiste:

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

Para mais detalhes, consulte a entrada do blog de Zain Naboulsis .


12
Além disso: se você quiser chamá-lo do cmd normal, basta @powershell -Command "get-content ...". A única ressalva é que você deve escapar aspas: ... -Command "get-content ... \" A expressão \ "..."
Tarc

1
@Tarc AFAIR, você pode usar aspas simples em seu comando e usar aspas duplas para citar o comando em vez

2
Tentei isso hoje em um arquivo para remover algumas coisas entre aspas em certos lugares, apenas para descobrir que a saída era um arquivo quase duas vezes maior que o original. O motivo parecia ser que esse método alterava a maneira como as novas linhas eram tratadas no arquivo para usar "\ r \ n" em vez de "\ n".
user132278

1
A duplicação devido a \ r \ n implicaria que seu arquivo era composto apenas de novas linhas. Aqui está o verdadeiro motivo: codificação .
Amit Naidu

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

94

sed (e seu ilk) estão contidos em vários pacotes de comandos do Unix.

Se 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 sedlinha 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

1
Não é exatamente isso que eu quero, mas acredito que a dependência do VBS é a solução mais leve.
Jakub Šturc 24/09/08

7
O GnuWin32 é uma solução nativa, se por nativo você quer dizer que foi projetado para ser executado no ambiente "normal" do Windows (diferente do CygWin). Experimente e você começará a esperar que eles estejam em TODOS os sistemas Windows que você usa. !!!
Michael Paulukonis

3
Funciona para o meu caso! Além disso, não esqueça a opção cscript "// NoLogo".
precisa saber é o seguinte

4
Se isso é "fora do punho", pergunte-se como é o seu outro código! Incrível, obrigado.
Sabuncu

2
Um utilitário de pesquisa e substituição de regex semelhante pode ser feito com o JScript. A vantagem do JScript sobre o VBScript é que ele pode ser facilmente combinado com o lote em um único script, facilitando o uso do utilitário em um contexto de lote ou linha de comando. Um robusto utilitário JScript / lote híbrido chamado REPL.BAT está disponível . Possui muitas opções de linha de comando. A documentação completa está incorporada no script. Certamente não possui capacidade total de sed, mas, mesmo assim, é bastante poderoso.
precisa saber é o seguinte


17

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.


10

Super Sed, uma versão aprimorada do sed. Para o Windows, este é um .exe independente, destinado à execução na linha de comando.


8
> (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

1
Funciona perfeitamente. Nota: os parênteses em "get-content" garantem que o arquivo não seja usado mais tarde quando "set-content" for chamado.
Kafu

é algo semelhante possível no cmd? em entender isso é apenas para pwsh
Ferroao

o 'SourceRegexp' deve ser substituído por qualquer regex possível? isso realmente funciona no power shell?
scjorge 27/02

7

Você pode tentar o PowerShell. Existem comandoslet get-content e set-content que você pode usar.


4
Essas são provavelmente as duas coisas no PowerShell que menos contribuem para o que sedfaz ;-). O -replaceoperador é provavelmente uma sugestão melhor.
Joey



6

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).


4

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


5
Ambos não existem mais nas versões de 64 bits do Windows.
Joey

3

Você pode olhar para o GNU Tools , que fornece (entre outras coisas) sed no Windows.


3

Existe um arquivo de lote auxiliar para o Windows chamado repl.batque possui grande capacidade do SED, mas doesn't require any additional downloadou instalação. É um arquivo de lote híbrido que utiliza Jscriptpara implementar os recursos e assim é swift, e doesn't suffer from the usual poison charactersde processamento em lote e alças linhas em branco com facilidade.

Download replde - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

O autor é @dbenham do stack overflow e dostips.com

Outro arquivo de lote auxiliar chamado findrepl.batfornece ao usuário do Windows grande parte da capacidade GREPe também é baseado emJscript e também é um arquivo em lote híbrido. Ele compartilha os benefícios do repl.bat

Download findreplde - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

O autor é @aacini do estouro de pilha e dostips.com


O link da caixa de depósito para repl está inativo. Você tem um link secundário?
Vishal Anand

2

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.


1

O Cygwin funciona, mas esses utilitários também estão disponíveis. Basta colocá-los em sua unidade, colocar o diretório em seu caminho e você terá muitos de seus utilitários amigáveis ​​para unix. IMHO mais leve que Cygwin (embora isso funcione tão bem).


0

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 .


1
A pergunta é sobre o Windows (cmd.exe) e não sobre DOS
a_horse_with_no_name

@royhowie: Entendo. Embora algumas dessas respostas possam ser úteis para alguém, concordo que a pergunta em si não é realmente adequada para SO. OTOH, não me sinto qualificado para recomendar a exclusão por atacado.
PM 2Ring

Nessa situação, acho que seria difícil incluir as partes essenciais da resposta, já que a parte essencial é um arquivo .exe hospedado na página vinculada. Entendo totalmente a preocupação com o rot-link, não tenho certeza de como poderia tornar isso independente para SO.
Bryan kennedy

Obrigado pela captura, a_horse_with_no_name. Eu estava sendo desleixado com o meu idioma. Eu editei meu comentário para corrigir o problema que você apontou.
Bryan kennedy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.