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?


1
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.
Bill_Stewart


Si vous souhaitez simplement supprimer certaines lignes d'un fichier, utilisez FIND /?
John Henckel

Réponses:


117

Aujourd'hui, PowerShell m'a sauvé.

Car grepil y a:

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

ou

select-string somefile.txt -pattern "expression"

et car sedil y a:

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

Pour plus de détails, voir l' entrée de blog de Zain Naboulsis .


12
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 .
Amit Naidu

2
@ and-bri (Get-Content c: \ temp \ test.txt) .replace ('[MYID]', 'MyValue') | Set-Content c: \ temp \ test.txt
AFP_555

95

sed (et ses semblables) sont contenus dans plusieurs packages de commandes Unix.

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 à

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

1
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.
dbenham le


17

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.


10

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.


8
> (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

1
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?
scjorge le

7

Vous pouvez essayer PowerShell. Il y a get-content et set-content que vous pouvez utiliser.


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

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


Si je ne peux vraiment pas utiliser un * nix comme shell, je préfère cela car c'est un petit exe autonome sans dépendances.
Qben


6

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


4

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


5
Les deux n'existent plus sur les versions 64 bits de Windows.
Joey


3

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

Télécharger repldepuis - 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.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

Téléchargement findrepldepuis - https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

L'auteur est @aacini de stack overflow et dostips.com


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.

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.


1

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


0

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


1
La question concerne Windows (cmd.exe) et non DOS
a_horse_with_no_name

@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é.
bryan kennedy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.