Je souhaite modifier le contenu du fichier par programme à l'aide de la ligne de commande Windows ( cmd.exe ). Dans * nix, il y a sed pour ces tâches. Existe-t-il un équivalent natif utile dans Windows?
Je souhaite modifier le contenu du fichier par programme à l'aide de la ligne de commande Windows ( cmd.exe ). Dans * nix, il y a sed pour ces tâches. Existe-t-il un équivalent natif utile dans Windows?
Réponses:
Aujourd'hui, PowerShell m'a sauvé.
Car grep
il y a:
get-content somefile.txt | where { $_ -match "expression"}
ou
select-string somefile.txt -pattern "expression"
et car sed
il y a:
get-content somefile.txt | %{$_ -replace "expression","replace"}
Pour plus de détails, voir l' entrée de blog de Zain Naboulsis .
sed
(et ses semblables) sont contenus dans plusieurs packages de commandes Unix.
sed
, cependant, grep
hors de la boîte.-z
option contrairement aux ports supérieurs répertoriésSi vous ne voulez rien installer et que votre système n'est pas Windows Server, vous pouvez utiliser un langage de script (VBScript par exemple) pour cela. Vous trouverez ci-dessous un coup de poignard grossier et improvisé. Votre ligne de commande ressemblerait à
cscript //NoLogo sed.vbs s/(oldpat)/(newpat)/ < inpfile.txt > outfile.txt
où oldpat et newpat sont des modèles de regex vbscript Microsoft . Évidemment, je n'ai implémenté que la commande de substitution et assumé certaines choses, mais vous pouvez l'étoffer pour être plus intelligent et mieux comprendre la ligne de sed
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
Si vous ne voulez rien installer (je suppose que vous voulez ajouter le script dans une solution / programme / etc qui sera exécuté sur d'autres machines), vous pouvez essayer de créer un script vbs (disons, 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
Et vous l'exécutez 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 celle-ci est plus conviviale en termes de caractères spéciaux ('> </).
Btw, je n'ai pas écrit ceci, mais je ne me souviens pas d'où je l'ai obtenu.
> (Get-content file.txt) | Foreach-Object {$_ -replace "^SourceRegexp$", "DestinationString"} | Set-Content file.txt
C'est le comportement de
sed -i 's/^SourceRegexp$/DestinationString/g' file.txt
Vous pouvez essayer PowerShell. Il y a get-content et set-content que vous pouvez utiliser.
sed
fait ;-). L' -replace
opérateur est probablement une meilleure suggestion.
Essayez fart.exe. C'est un utilitaire de recherche et de remplacement de texte qui peut être utilisé dans les programmes de commandes par lots.
Vous pouvez installer Cygwin ( http://www.cygwin.com/ ) et utiliser sed à partir de là.
J'utilise Cygwin . Je rencontre beaucoup de gens qui ne réalisent pas que si vous mettez les binaires Cygwin sur votre PATH, vous pouvez les utiliser à partir du shell de commande Windows. Vous n'êtes pas obligé d'exécuter Cygwin's Bash.
Vous pouvez également consulter les services Windows pour Unix disponibles auprès de Microsoft (mais uniquement sur les versions Professional et supérieures de Windows).
edlin ou modifier
De plus, les services Windows pour Unix sont fournis avec de nombreux outils unix pour Windows. http://technet.microsoft.com/en-us/interopmigration/bb380242.aspx
Mise à jour 12/7/12 Dans Windows 2003 R2, Windows 7 et Server 2008, etc., ce qui précède est remplacé par le sous-système pour les applications UNIX (SUA) en tant que module complémentaire. Mais vous devez télécharger les utilitaires: http://www.microsoft.com/en-us/download/details.aspx?id=2391
Vous pouvez regarder les outils GNU , ils fournissent (entre autres) sed sur Windows.
Il existe un fichier batch d'assistance pour Windows appelé repl.bat
qui a 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 et donc est swift
, et doesn't suffer from the usual poison characters
de traitement par lots et gère les lignes vides avec facilité.
Télécharger repl
depuis - https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
L'auteur est @dbenham de stack overflow et dostips.com
Un autre fichier batch d'assistance appelé findrepl.bat
donne à l'utilisateur Windows une grande partie de la capacité de GREP
et est également basé surJscript
et est également un fichier batch hybride. Il partage les avantages de repl.bat
Téléchargement findrepl
depuis - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat
L'auteur est @aacini de stack overflow et dostips.com
Pour autant que je sache, rien de tel que sed n'est fourni avec des fenêtres. Cependant, sed est disponible pour Windows sous plusieurs formes différentes, y compris dans le cadre de Cygwin, si vous souhaitez un sous-système POSIX complet, ou en tant qu'exécutable natif Win32 si vous souhaitez exécuter uniquement sed sur la 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 modules complémentaires, tels que VBScript.
J'avais besoin d'un outil sed qui fonctionnait pour l'invite Windows cmd.exe. Le portage de sed par Eric Pement vers un seul fichier DOS .exe a très bien fonctionné pour moi.
C'est assez bien documenté .