Existe-t-il un utilitaire sed comme pour cmd.exe? [fermé]
149
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?
Que voulez-vous dire par "natif" ??? Installable pour fonctionner dans cmd.exe, ou pour travailler sans aucune installation? Si le premier, voir GnuWin32 ref'd ci-dessous; si ce dernier, non. Pas de sed natif pré-installé pour Windows.
Michael Paulukonis
6
Par natif, je voulais dire une solution qui fonctionne sur toutes les fenêtres sans installer de choses supplémentaires.
Jakub Šturc
1
Laissez cmd.exe derrière et utilisez PowerShell à la place.
De plus: si vous voulez l'appeler à partir d'une cmd normale, il suffit de @powershell -Command "get-content ...". La seule mise en garde est que vous devez échapper les guillemets: ... -Commande "get-content ... \" expression \ ", ..."
Tarc
1
@Tarc AFAIR, vous pouvez utiliser des guillemets simples dans votre commande et utiliser des guillemets doubles pour citer la commande à la place
2
J'ai essayé cela aujourd'hui sur un fichier pour supprimer des éléments entre guillemets à certains endroits, pour découvrir que la sortie était un fichier presque deux fois plus volumineux que l'original. La raison semble être que cette méthode a changé la façon dont les retours à la ligne étaient gérés dans le fichier pour utiliser "\ r \ n" au lieu de "\ n".
user132278
1
Le fait de doubler en raison de \ r \ n impliquerait que votre fichier était uniquement composé de nouvelles lignes. Voici la vraie raison: l' encodage .
Le sous-système Windows pour Linux est une option la plus "native", mais il n'est pas installé sur Windows par défaut; il a sed, cependant, grephors de la boîte.
Si 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 à
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 sedcommande.
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
Ce n'est pas exactement ce que je veux, mais je crois que la dépendance à VBS est la solution la plus légère.
Jakub Šturc
7
GnuWin32 est une solution native, si par native vous entendez conçu pour fonctionner dans l'environnement Windows "normal" (contrairement à CygWin). Essayez-les et vous vous attendez à ce qu'ils soient sur TOUS les systèmes Windows que vous utilisez. !!!
Michael Paulukonis
3
Fonctionne pour mon cas! N'oubliez pas non plus l'option cscript "// NoLogo".
Marko Dumic
4
Si c'est "improvisé", demandez-vous à quoi ressemble votre autre code! Incroyable, merci.
Sabuncu le
2
Un utilitaire de recherche et de remplacement de regex similaire peut être réalisé avec JScript. L'avantage de JScript par rapport à VBScript est qu'il peut être facilement combiné avec batch dans un seul script, ce qui facilite l'utilisation de l'utilitaire dans un contexte de batch ou de ligne de commande. Un utilitaire JScript / batch hybride robuste appelé REPL.BAT est disponible . Il a de nombreuses options de ligne de commande. Une documentation complète est intégrée au script. Il n'a certainement pas la pleine capacité de sed, mais même ainsi, il est assez puissant.
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):
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.
Cela fonctionne parfaitement. Remarque: les parenthèses sur "get-content" garantissent que le fichier ne sera pas utilisé plus tard lorsque "set-content" sera appelé.
Kafu
est-ce que quelque chose de similaire est possible dans cmd? Comprenez ceci est pour pwsh seulement
Ferroao
'SourceRegexp' doit-il être remplacé par une éventuelle regex? cela fonctionne-t-il vraiment dans Power Shell?
Ce sont probablement les deux choses dans PowerShell qui contribuent le moins à ce que sedfait ;-). L' -replaceopérateur est probablement une meilleure suggestion.
Joey
7
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.
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).
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
Il existe un fichier batch d'assistance pour Windows appelé repl.batqui a une grande partie de la capacité de SED mais doesn't require any additional downloadou d'installation. Il s'agit d'un fichier de commandes hybride qui utilise Jscriptpour implémenter les fonctionnalités et donc est swift, et doesn't suffer from the usual poison charactersde traitement par lots et gère les lignes vides avec facilité.
L'auteur est @dbenham de stack overflow et dostips.com
Un autre fichier batch d'assistance appelé findrepl.batdonne à l'utilisateur Windows une grande partie de la capacité de GREPet est également basé surJscript et est également un fichier batch hybride. Il partage les avantages de repl.bat
Le lien de la boîte de dépôt pour repl est en panne. Avez-vous un lien secondaire?
Vishal Anand
2
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.
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.
Cygwin fonctionne, mais ces utilitaires sont également disponibles. Placez-les simplement sur votre lecteur, placez le répertoire dans votre chemin et vous avez beaucoup de vos utilitaires unix conviviaux. Plus léger IMHO que Cygwin (bien que cela fonctionne aussi bien).
@royhowie: Je vois. Bien que certaines de ces réponses puissent être utiles à quelqu'un, je conviens que la question elle-même ne convient pas vraiment à SO. OTOH, je ne me sens pas qualifié pour recommander la suppression en gros.
PM 2 Ring le
Dans cette situation, je pense qu'il serait difficile d'inclure les parties essentielles de la réponse, puisque la partie essentielle est un fichier .exe qui est hébergé sur la page liée. Je comprends tout à fait l'inquiétude au sujet de la pourriture des liens, je ne sais pas comment je pourrais rendre cela autonome à SO.
bryan kennedy
Merci pour la capture, a_horse_with_no_name. J'étais bâclé avec ma langue. J'ai modifié mon commentaire pour résoudre le problème que vous avez signalé.
Réponses:
Aujourd'hui, PowerShell m'a sauvé.
Car
grep
il y a:ou
et car
sed
il y a:Pour plus de détails, voir l' entrée de blog de Zain Naboulsis .
la source
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 à
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.la source
UnxUtils fournit sed pour Win32, tout comme GNUWin32 .
la source
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):
Et vous l'exécutez comme ceci:
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.
la source
Il y a Super Sed une version améliorée de sed. Pour Windows, il s'agit d'un .exe autonome, destiné à être exécuté à partir de la ligne de commande.
la source
C'est le comportement de
la source
Vous pouvez essayer PowerShell. Il y a get-content et set-content que vous pouvez utiliser.
la source
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.
http://sourceforge.net/projects/fart-it/
la source
Vous pouvez installer Cygwin ( http://www.cygwin.com/ ) et utiliser sed à partir de là.
la source
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).
la source
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
la source
Vous pouvez regarder les outils GNU , ils fournissent (entre autres) sed sur Windows.
la source
Il existe un fichier batch d'assistance pour Windows appelé
repl.bat
qui a une grande partie de la capacité de SED maisdoesn't require any additional download
ou d'installation. Il s'agit d'un fichier de commandes hybride qui utiliseJscript
pour implémenter les fonctionnalités et donc estswift
, etdoesn'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.batL'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é deGREP
et est également basé surJscript
et est également un fichier batch hybride. Il partage les avantages de repl.batTéléchargement
findrepl
depuis - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.batL'auteur est @aacini de stack overflow et dostips.com
la source
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.
la source
Cygwin fonctionne, mais ces utilitaires sont également disponibles. Placez-les simplement sur votre lecteur, placez le répertoire dans votre chemin et vous avez beaucoup de vos utilitaires unix conviviaux. Plus léger IMHO que Cygwin (bien que cela fonctionne aussi bien).
la source
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é .
la source