Gibt es ein Dienstprogramm für cmd.exe? [geschlossen]

149

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?

Jakub Šturc
quelle
1
Was meinst du mit "native" ??? Installierbar für die Arbeit in cmd.exe oder für die Arbeit ohne Installation? Wenn erstere, siehe GnuWin32, siehe unten; wenn letzteres, nein. Kein vorinstalliertes natives Sed für Windows.
Michael Paulukonis
6
Mit native meinte ich eine Lösung, die unter allen Fenstern läuft, ohne zusätzliche Dinge zu installieren.
Jakub Šturc
1
Lassen Sie cmd.exe hinter sich und verwenden Sie stattdessen PowerShell.
Bill_Stewart
Siehe auch
AlikElzin-kilaka
Wenn Sie nur bestimmte Zeilen aus einer Datei löschen möchten, verwenden Sie FIND /?
John Henckel

Antworten:

117

Heute hat mich Powershell gerettet.

Denn grepes gibt:

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

oder

select-string somefile.txt -pattern "expression"

und denn sedes gibt:

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

Weitere Informationen finden Sie im Blogeintrag von Zain Naboulsis .

Jakub Šturc
quelle
12
Außerdem: Wenn Sie es von normalem cmd aus aufrufen möchten, geben Sie einfach @powershell -Command "get-content ..." ein. Die einzige Einschränkung ist, dass Sie Anführungszeichen vermeiden müssen: ... -Befehl "get-content ... \" expression \ ", ..."
Tarc
1
@Tarc AFAIR, Sie können einfache Anführungszeichen in Ihrem Befehl verwenden und doppelte Anführungszeichen verwenden, um stattdessen den Befehl in Anführungszeichen zu setzen
2
Ich habe dies heute an einer Datei versucht, um an bestimmten Stellen einige Dinge zwischen Anführungszeichen zu entfernen, nur um festzustellen, dass die Ausgabe eine Datei war, die fast doppelt so groß war wie das Original. Der Grund schien zu sein, dass diese Methode die Art und Weise, wie Zeilenumbrüche in der Datei behandelt wurden, dahingehend änderte, dass "\ r \ n" anstelle von "\ n" verwendet wurde.
user132278
1
Eine Verdoppelung aufgrund von \ r \ n würde bedeuten, dass Ihre Datei nur aus Zeilenumbrüchen besteht. Hier ist der wahre Grund: Codierung .
Amit Naidu
2
@ and-bri (Get-Content c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | Set-Content c: \ temp \ test.txt
AFP_555
94

sed (und sein ilk) sind in mehreren Paketen von Unix-Befehlen enthalten.

Wenn 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 sedBefehlszeile 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
bw
quelle
1
Dies ist nicht genau das, was ich will, aber ich glaube, dass die Abhängigkeit von VBS die leichteste Lösung ist.
Jakub Šturc
7
GnuWin32 ist eine native Lösung, wenn mit native gemeint ist, dass sie in der "normalen" Windows-Umgebung ausgeführt werden soll (im Gegensatz zu CygWin). Probieren Sie sie aus und Sie werden erwarten, dass sie auf JEDEM Windows-System sind, das Sie verwenden. !!!
Michael Paulukonis
3
Funktioniert für meinen Fall! Vergessen Sie auch nicht die cscript-Option "// NoLogo".
Marko Dumic
4
Wenn dies "off-the-cuff" ist, fragen Sie sich, wie Ihr anderer Code aussieht! Erstaunlich, danke.
Sabuncu
2
Ein ähnliches Regex-Dienstprogramm zum Suchen und Ersetzen kann mit JScript durchgeführt werden. Der Vorteil von JScript gegenüber VBScript besteht darin, dass es problemlos mit einem Stapel in einem einzigen Skript kombiniert werden kann, wodurch die Verwendung des Dienstprogramms in einem Stapel- oder Befehlszeilenkontext vereinfacht wird. Ein robustes hybrides JScript / Batch-Dienstprogramm namens REPL.BAT ist verfügbar . Es gibt viele Befehlszeilenoptionen. Die vollständige Dokumentation ist in das Skript eingebettet. Es hat sicherlich nicht die volle Sed-Fähigkeit, aber trotzdem ist es ziemlich mächtig.
Dbenham
17

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.

Rober
quelle
10

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.

Rob Kam
quelle
8
> (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
Krogon
quelle
1
Es funktioniert perfekt. Hinweis: Die Klammern zu "get-content" stellen sicher, dass die Datei später nicht mehr verwendet wird, wenn "set-content" aufgerufen wird.
Kafu
ist etwas ähnliches in cmd möglich? Ich verstehe, dass dies nur für Pwsh gilt
Ferroao
Soll 'SourceRegexp' durch einen möglichen regulären Ausdruck ersetzt werden? funktioniert das wirklich in power shell?
Scjorge
7

Sie könnten Powershell versuchen. Es gibt eingebaute Commandlets zum Abrufen von Inhalten und zum Festlegen von Inhalten , die Sie verwenden können.

James Boother
quelle
4
Das sind wahrscheinlich die beiden Dinge in PowerShell, die am wenigsten zu dem beitragen, was sedsie tun ;-). Der -replaceBetreiber ist wahrscheinlich ein besserer Vorschlag.
Joey
7

Versuchen Sie fur.exe. Es ist ein Dienstprogramm zum Suchen und Ersetzen von Text, das in Befehlsstapelprogrammen verwendet werden kann.

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

Colin Nicholls
quelle
Wenn ich eine * nix-ähnliche Shell wirklich nicht verwenden kann, bevorzuge ich dies, da es sich um eine kleine eigenständige Exe ohne Abhängigkeiten handelt.
Qben
6

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

Brandon DuRette
quelle
4

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

Booji Boy
quelle
5
Beide existieren unter 64-Bit-Versionen von Windows nicht mehr.
Joey
3

Sie können sich GNU Tools ansehen , die (unter anderem) auf Windows verfügbar sind.

Linor
quelle
3

Es gibt eine Helper-Batch-Datei für Windows, repl.batdie einen Großteil der SED-Funktionen doesn't require any additional downloadoder der Installation bietet . Es handelt sich um eine hybride Batch-Datei, die Jscriptzur Implementierung der Funktionen swiftund doesn't suffer from the usual poison charactersder Stapelverarbeitung verwendet wird und Leerzeilen problemlos verarbeitet.

Download replvon - 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.batnennt dem Windows-Benutzer viel von der Fähigkeit GREPund basiert auch aufJscript ebenfalls auf einer Hybrid-Batchdatei und ist ebenfalls eine Hybrid-Batchdatei. Es teilt die Vorteile von repl.bat

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

Der Autor ist @aacini von Stack Overflow und dostips.com

foxidrive
quelle
Der Dropbox-Link für Repl ist ausgefallen. Hast du einen sekundären Link?
Vishal Anand
2

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.

Jay
quelle
1

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

Kennzeichen
quelle
0

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 .

bryan kennedy
quelle
1
Die Frage
bezieht sich auf
@royhowie: Ich verstehe. Obwohl einige dieser Antworten für jemanden nützlich sein können, stimme ich zu, dass die Frage selbst für SO nicht wirklich geeignet ist. OTOH, ich fühle mich nicht qualifiziert, die Löschung im Großhandel zu empfehlen.
PM 2Ring
In dieser Situation wäre es meiner Meinung nach schwierig, die wesentlichen Teile der Antwort aufzunehmen, da der wesentliche Teil eine EXE-Datei ist, die auf der verlinkten Seite gehostet wird. Ich verstehe die Sorge um Link-Rot vollkommen. Ich bin mir nur nicht sicher, wie ich dies zu SO machen könnte.
Bryan Kennedy
Danke für den Fang, a_horse_with_no_name. Ich war schlampig mit meiner Sprache. Ich habe meinen Kommentar bearbeitet, um das Problem zu beheben, auf das Sie hingewiesen haben.
Bryan Kennedy