Question

Je souhaite modifier par programmation le contenu d'un fichier à l'aide de la ligne de commande Windows ( cmd.exe ). Dans * nix, il existe sed pour cette tâche. Existe-t-il un équivalent utile dans Windows?

Edit: je recherche une solution de ligne de commande native.

Était-ce utile?

La solution

Aujourd'hui, powershell m'a sauvé.

Pour grep il y a:

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

et pour sed il y a:

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

Pour plus de détails, consultez le blog de Zain Naboulsis entrée .

Autres conseils

sed (et son équivalent) sont contenus dans plusieurs packages de commandes Unix.

Si vous ne souhaitez rien installer et que votre système n'est pas un système Windows Server, vous pouvez utiliser un langage de script (VBScript, par exemple) pour cela. Ci-dessous se trouve un coup de poing brutal. Votre ligne de commande ressemblerait à

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

où oldpat et newpat sont Modèles de regex vbscript Microsoft . Bien entendu, j’ai seulement implémenté la commande de substitution et pris en charge certaines choses, mais vous pourriez en dire plus pour être plus intelligent et mieux comprendre la <=> ligne de commande.

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

UnxUtils fournit sed pour Win32, de même que GNUWin32 .

Si vous ne souhaitez rien installer (je suppose que vous voulez ajouter le script à une solution / programme / etc qui sera exécuté sur d’autres machines), vous pouvez essayer de créer un script vbs (disons, remplacez. 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

Et vous le lancez comme ceci:

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

Ce qui est similaire à la version sed fournie par & "; Bill Weaver &" ;, mais je pense que celui-ci est plus convivial en termes de spécial ('> < / ) caractères.

Btw, je n'ai pas écrit ça, mais je ne me souviens pas d'où je l'ai eu.

Il existe Super Sed une version améliorée de sed. Pour Windows, il s’agit d’un fichier .exe autonome, conçu pour être exécuté à partir de la ligne de commande.

Essayez fart.exe. Il s’agit d’un utilitaire de recherche et de remplacement de texte utilisable dans les programmes de commandes en mode batch.

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

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

Ceci est le comportement de

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

Vous pouvez installer Cygwin ( http://www.cygwin.com/ ) et l'utiliser à partir de là. .

Vous pouvez essayer PowerShell. Il existe get-content et Les commandlets set-content sont une construction que vous pouvez utiliser.

J'utilise Cygwin . Je rencontre beaucoup de gens qui ne réalisent pas que si vous placez les fichiers binaires Cygwin sur votre PATH, vous pouvez les utiliser à partir du shell de commande Windows. Vous n'êtes pas obligé de lancer Cygwin's Bash.

Vous pouvez également rechercher Windows Services for Unix disponible auprès de Microsoft. (mais uniquement sur les versions professionnelle et ultérieure de Windows).

edlin ou modifier

De plus, Windows Services for Unix est fourni avec de nombreux outils Unix pour Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242. aspx

Mise à jour du 12/7/12 Dans Windows 2003 R2, Windows 7 & Amp; Server 2008, etc., ce qui précède est remplacé par le sous-système pour applications basées sur UNIX (SUA) en tant qu’add-on. Mais vous devez télécharger les utilitaires: http://www.microsoft.com/en-us/ download / details.aspx? id = 2391

Vous pouvez consulter les Outils GNU , qui fournissent (entre autres choses) sed sous Windows.

Il existe un fichier de commandes auxiliaire pour Windows appelé repl.bat qui présente une grande partie de la capacité de SED, mais doesn't require any additional download ou d'installation. Il s’agit d’un fichier de commandes hybride qui utilise Jscript pour implémenter les fonctionnalités. Il en est de même de swift, et doesn't suffer from the usual poison characters du traitement par lots, qui gère facilement les lignes vides.

Téléchargez repl à partir de - https://www.dropbox.com/s/ qidqwztmetbvklt / repl.bat

L'auteur est @dbenham from stack overflow et dostips.com

Un autre fichier batch d'aide appelé findrepl.bat donne à l'utilisateur Windows une grande partie des capacités de GREP et est également basé sur findrepl et est également un fichier batch hybride. Il partage les avantages de repl.bat

Téléchargez <=> à partir de - https://www.dropbox.com/s/ rfdldmcb6vwi9xc / findrepl.bat

L'auteur est @aacini à partir du débordement de la pile et de dostips.com

Pour autant que je sache, rien n’est comparable à sed qui est livré avec Windows. Toutefois, sed est disponible pour Windows sous différentes formes, notamment dans Cygwin, si vous souhaitez un sous-système POSIX complet, ou sous la forme d’un exécutable natif Win32 si vous souhaitez exécuter sed uniquement en ligne de commande.

Sed pour Windows (projet GnuWin32)

S'il doit être natif de Windows, la seule autre chose que je puisse suggérer serait d'utiliser un langage de script pris en charge par Windows sans add-ons, tel que VBScript.

Cygwin fonctionne, mais les ces utilitaires sont également disponibles. Il suffit de les placer sur votre disque, de placer le répertoire dans votre chemin et vous disposez de nombreux utilitaires Unix conviviaux. Un IMHO plus léger que Cygwin (bien que cela fonctionne aussi bien).

J'avais besoin d'un outil sed qui répondait à l'invite Windows cmd.exe. Le port de sed par Eric Pement sur un seul fichier .exe a fonctionné à merveille pour moi. .

C’est plutôt bien documenté .

Cela fonctionne sur Vista Ultimate, pas sûr de Pro.

sed -f commandfilename.cmd file1 > file2
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top