Ich möchte den Dateiinhalt programmgesteuert über die Windows-Befehlszeile ( cmd.exe ) bearbeiten . In * nix gibt es sed für diese Aufgaben. Gibt es ein nützliches natives Äquivalent in Windows?
Ich möchte den Dateiinhalt programmgesteuert über die Windows-Befehlszeile ( cmd.exe ) bearbeiten . In * nix gibt es sed für diese Aufgaben. Gibt es ein nützliches natives Äquivalent in Windows?
Antworten:
Heute hat mich Powershell gerettet.
Denn grep
es gibt:
get-content somefile.txt | where { $_ -match "expression"}
oder
select-string somefile.txt -pattern "expression"
und denn sed
es gibt:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Weitere Informationen finden Sie im Blogeintrag von Zain Naboulsis .
sed
(und sein ilk) sind in mehreren Paketen von Unix-Befehlen enthalten.
sed
, grep
usw. aus der Box, though.-z
Optionen unterstützenWenn Sie nichts installieren möchten und Ihr System kein Windows Server ist, dann Sie könnte eine Skriptsprache (VBScript eg) dafür. Unten ist ein grober Stich von der Stange zu sehen. Ihre Befehlszeile würde so aussehen
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
Dabei sind Oldpat und Newpat Microsoft VBScript-Regex-Muster . Natürlich habe ich nur den Ersatzbefehl implementiert und einige Dinge angenommen, aber Sie könnten ihn ausarbeiten, um klüger zu sein und mehr über die sed
Befehlszeile zu verstehen .
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
Wenn Sie nichts installieren möchten (ich nehme an, Sie möchten das Skript zu einer Lösung / einem Programm / usw. hinzufügen, die auf anderen Computern ausgeführt wird), können Sie versuchen, ein vbs-Skript zu erstellen (z. B. 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
Und du machst es so:
cscript replace.vbs "C:\One.txt" "Robert" "Rob"
Das ähnelt der sed-Version von "bill weaver", aber ich denke, diese ist in Bezug auf Sonderzeichen ('> </) freundlicher.
Übrigens habe ich das nicht geschrieben, aber ich kann mich nicht erinnern, woher ich es habe.
Es gibt Super Sed, eine verbesserte Version von sed. Für Windows ist dies eine eigenständige EXE-Datei, die über die Befehlszeile ausgeführt werden kann.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
Dies ist das Verhalten von
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Sie könnten Powershell versuchen. Es gibt eingebaute Commandlets zum Abrufen von Inhalten und zum Festlegen von Inhalten , die Sie verwenden können.
sed
sie tun ;-). Der -replace
Betreiber ist wahrscheinlich ein besserer Vorschlag.
Versuchen Sie fur.exe. Es ist ein Dienstprogramm zum Suchen und Ersetzen von Text, das in Befehlsstapelprogrammen verwendet werden kann.
Sie können Cygwin ( http://www.cygwin.com/ ) installieren und von dort aus sed verwenden.
Ich benutze Cygwin . Ich treffe viele Leute, die nicht wissen, dass Sie die Cygwin-Binärdateien in der Windows-Befehlsshell verwenden können, wenn Sie sie in Ihren PATH einfügen. Sie müssen Cygwin's Bash nicht ausführen.
Sie können sich auch mit Windows Services für Unix befassen, die von Microsoft erhältlich sind (jedoch nur in den Professional- und höheren Windows-Versionen).
edlin oder bearbeiten
Außerdem gibt es Windows Services für Unix, das viele Unix-Tools für Windows enthält. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Update 07.12.12 In Windows 2003 R2, Windows 7 und Server 2008 usw. wird das oben Gesagte durch das Subsystem für UNIX-basierte Anwendungen (SUA) als Add-On ersetzt. Sie müssen jedoch die Dienstprogramme herunterladen: http://www.microsoft.com/en-us/download/details.aspx?id=2391
Es gibt eine Helper-Batch-Datei für Windows, repl.bat
die einen Großteil der SED-Funktionen doesn't require any additional download
oder der Installation bietet . Es handelt sich um eine hybride Batch-Datei, die Jscript
zur Implementierung der Funktionen swift
und doesn't suffer from the usual poison characters
der Stapelverarbeitung verwendet wird und Leerzeilen problemlos verarbeitet.
Download repl
von - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
Der Autor ist @dbenham von Stack Overflow und dostips.com
Eine andere Helfer-Batch-Datei namens findrepl.bat
nennt dem Windows-Benutzer viel von der Fähigkeit GREP
und basiert auch aufJscript
ebenfalls auf einer Hybrid-Batchdatei und ist ebenfalls eine Hybrid-Batchdatei. Es teilt die Vorteile von repl.bat
Download findrepl
von - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
Der Autor ist @aacini von Stack Overflow und dostips.com
Soweit ich weiß, ist nichts wie sed mit Fenstern gebündelt. Sed ist jedoch für Windows in verschiedenen Formen verfügbar, unter anderem als Teil von Cygwin, wenn Sie ein vollständiges POSIX-Subsystem benötigen, oder als native ausführbare Win32-Datei, wenn Sie nur sed in der Befehlszeile ausführen möchten.
Sed für Windows (GnuWin32-Projekt)
Wenn es für Windows nativ sein muss, kann ich nur vorschlagen, eine von Windows unterstützte Skriptsprache ohne Add-Ons wie VBScript zu verwenden.
Cygwin funktioniert, aber diese Dienstprogramme sind auch verfügbar. Legen Sie sie einfach auf Ihr Laufwerk, legen Sie das Verzeichnis in Ihren Pfad und Sie haben viele Ihrer freundlichen Unix-Dienstprogramme. Leichter IMHO, dass Cygwin (obwohl das genauso gut funktioniert).
Ich brauchte ein sed-Tool, das für die Windows-Eingabeaufforderung cmd.exe funktioniert. Eric Pements Port von sed auf eine einzelne DOS .exe hat für mich großartig funktioniert.
Es ist ziemlich gut dokumentiert .