C'è qualche utilità simile a sed per cmd.exe? [chiuso]


149

Voglio modificare a livello di codice il contenuto del file utilizzando la riga di comando di Windows ( cmd.exe ). In * nix c'è sed per questo compito. C'è qualche equivalente nativo utile in Windows?


1
Cosa intendi con "nativo" ??? Installabile per funzionare in cmd.exe o per funzionare senza installazione? Se il primo, vedi GnuWin32 refed sotto; se quest'ultimo, no. Nessuna versione nativa preinstallata per Windows.
Michael Paulukonis,

6
Per nativo intendevo una soluzione che funziona su tutte le finestre senza installare roba aggiuntiva.
Jakub Šturc,

1
Lascia indietro cmd.exe e usa invece PowerShell.
Bill_Stewart


Se si desidera eliminare solo determinate righe da un file, utilizzare TROVA /?
John Henckel,

Risposte:


117

Oggi PowerShell mi ha salvato.

Perché grepc'è:

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

o

select-string somefile.txt -pattern "expression"

e perché sedc'è:

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

Per maggiori dettagli vedi il blog di Zain Naboulsis .


12
Inoltre: se vuoi chiamarlo dal normale cmd, basta @powershell -Command "get-content ...". L'unica avvertenza è che è necessario sfuggire alle virgolette: ... -Comando "get-content ... \" expression \ ", ..."
Tarc

1
@Tarc AFAIR, puoi usare virgolette singole nel tuo comando e utilizzare invece virgolette doppie per citare il comando

2
Ho provato questo oggi su un file per rimuovere alcune cose tra virgolette in determinati punti, solo per scoprire che l'output era un file grande quasi il doppio dell'originale. Il motivo sembrava essere che questo metodo ha cambiato il modo in cui le newline sono state gestite nel file per usare "\ r \ n" invece di "\ n".
user132278,

1
Il raddoppio dovuto a \ r \ n implicherebbe che il tuo file fosse composto esclusivamente da newline. Ecco il vero motivo: la codifica .
Amit Naidu,

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

95

sed (e il suo simile) sono contenuti in diversi pacchetti di comandi Unix.

Se non si desidera installare nulla e il vostro sistema non è un Windows Server uno, allora si potrebbe utilizzare un linguaggio di scripting (VBScript per esempio) per questo. Di seguito è riportato un grosso colpo al braccio. La tua riga di comando sarebbe simile

cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt

dove oldpat e newpat sono modelli regex di Microsoft vbscript . Ovviamente ho implementato solo il comando sostitutivo e assunto alcune cose, ma potresti renderlo più intelligente e comprendere meglio la sedriga di 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
Questo non è esattamente quello che voglio, tuttavia credo che la dipendenza da VBS sia la soluzione più leggera.
Jakub Šturc,

7
GnuWin32 è una soluzione nativa, se per nativo intendi progettato per funzionare nell'ambiente Windows "normale" (a differenza di CygWin). Provali e inizierai ad aspettarti che siano su OGNI sistema Windows che usi. !!!
Michael Paulukonis,

3
Funziona per il mio caso! Inoltre, non dimenticare l'opzione cscript "// NoLogo".
Marko Dumic,

4
Se questo è "off-the-cuff", chiediti com'è il tuo altro codice! Incredibile, grazie.
Sabuncu,

2
Una ricerca regex simile e l'utilità di sostituzione possono essere eseguite con JScript. Il vantaggio di JScript su VBScript è che può essere facilmente combinato con batch in un singolo script, rendendo l'utilità più facile da usare in un contesto batch o da riga di comando. È disponibile una robusta utility ibrida JScript / batch denominata REPL.BAT . Ha molte opzioni da linea di comando. La documentazione completa è incorporata nello script. Certamente non ha la piena capacità di sed, ma anche così, è abbastanza potente.
dbenham,


17

Se non vuoi installare nulla (suppongo che tu voglia aggiungere lo script in qualche soluzione / programma / etc che verrà eseguito su altre macchine), potresti provare a creare uno script vbs (diciamo, sostituisci.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 lo esegui in questo modo:

cscript replace.vbs "C:\One.txt" "Robert" "Rob"

Che è simile alla versione sed fornita da "bill weaver", ma penso che questo sia più amichevole in termini di caratteri speciali ('> </).

A proposito, non ho scritto questo, ma non ricordo da dove l'ho preso.


10

C'è Super Sed una versione migliorata di sed. Per Windows questo è un file .exe autonomo, progettato per essere eseguito dalla riga di comando.


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

Questo è il comportamento di

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

1
Funziona perfettamente. Nota: le parentesi su "get-content" assicurano che il file non sarà utilizzato in seguito quando verrà chiamato "set-content".
Kafu,

è possibile qualcosa di simile in cmd? a capire questo è solo per pwsh
Ferroao

"SourceRegexp" deve essere sostituito da una possibile regex? funziona davvero in Power Shell?
scjorge,

7

Potresti provare PowerShell. Ci sono commandlet get-content e set-content integrati che puoi usare.


4
Queste sono probabilmente le due cose in PowerShell che contribuiscono meno a ciò che sedfa ;-). L' -replaceoperatore è probabilmente un suggerimento migliore.
Joey,



6

Uso Cygwin . Incontro molte persone che non si rendono conto che se metti i binari Cygwin sul tuo PERCORSO, puoi usarli dalla shell dei comandi di Windows. Non è necessario eseguire Cygwin's Bash.

Puoi anche consultare i servizi Windows per Unix disponibili da Microsoft (ma solo sulle versioni Professional e precedenti di Windows).


4

edlin o modifica

inoltre ci sono i servizi Windows per Unix forniti con molti strumenti unix per Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx

Aggiornamento 12/7/12 In Windows 2003 R2, Windows 7 e Server 2008, ecc. Quanto sopra è sostituito dal sottosistema per le applicazioni basate su UNIX (SUA) come componente aggiuntivo. Ma devi scaricare i programmi di utilità: http://www.microsoft.com/en-us/download/details.aspx?id=2391


5
Entrambi non esistono più nelle versioni a 64 bit di Windows.
Joey,


3

Esiste un file batch di supporto per Windows chiamato repl.batche ha molte delle capacità di SED ma doesn't require any additional downloado di installazione. È un file batch ibrido che utilizza Jscriptper implementare le funzionalità e così è swift, e doesn't suffer from the usual poison charactersper l'elaborazione batch e gestisce facilmente le righe vuote.

Scarica replda - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

L'autore è @dbenham dallo stack overflow e dostips.com

Un altro file batch di supporto chiamato findrepl.batoffre all'utente Windows la maggior parte delle capacità GREPe si basa anche su Jscriptun file batch ibrido. Condivide i vantaggi di repl.bat

Scarica findreplda - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

L'autore è @aacini dallo stack overflow e dostips.com


Il link dropbox per repl è inattivo. Hai un link secondario?
Vishal Anand,

2

Per quanto ne so nulla di simile a sed è in bundle con Windows. Tuttavia, sed è disponibile per Windows in diverse forme, anche come parte di Cygwin, se si desidera un sottosistema POSIX completo o come eseguibile nativo Win32 se si desidera eseguire solo sed dalla riga di comando.

Sed per Windows (progetto GnuWin32)

Se deve essere nativo di Windows, l'unica altra cosa che posso suggerire sarebbe quella di utilizzare un linguaggio di scripting supportato da Windows senza componenti aggiuntivi, come VBScript.


1

Cygwin funziona, ma sono disponibili anche queste utilità. Basta rilasciarli sul disco rigido, inserire la directory nel percorso e disporre di molte delle utili utility unix. Leggero IMHO che Cygwin (anche se funziona altrettanto bene).


0

Avevo bisogno di uno strumento sed che funzionasse per il prompt di Windows cmd.exe. Il port di sed di Eric Pement su un singolo file .exe DOS ha funzionato perfettamente per me.

È abbastanza ben documentato .


1
La domanda riguarda Windows (cmd.exe) e non DOS
a_horse_with_no_name

@royhowie: capisco. Anche se alcune di queste risposte possono essere utili a qualcuno, sono d'accordo sul fatto che la domanda in sé non è davvero adatta a SO. OTOH, non mi sento qualificato per raccomandare la cancellazione all'ingrosso.
PM 2Ring

In questa situazione, penso che sarebbe difficile includere le parti essenziali della risposta, poiché la parte essenziale è un file .exe che è ospitato sulla pagina collegata. Capisco perfettamente la preoccupazione per il collegamento-marciume, non sono sicuro di come potrei renderlo autonomo per SO.
Bryan Kennedy

Grazie per la cattura, a_horse_with_no_name. Ero sciatto con la mia lingua. Ho modificato il mio commento per risolvere il problema che hai sottolineato.
Bryan Kennedy il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.