193 votes

Existe-t-il un utilitaire de type sed pour cmd.exe ?

Je veux modifier par programme le contenu d'un fichier en utilisant la ligne de commande de Windows ( cmd.exe ). Dans *nix, il y a sed pour cette tâche. Existe-t-il un équivalent natif utile dans Windows ?

1 votes

Que voulez-vous dire par "natif" ? ?? Installable pour fonctionner dans cmd.exe, ou pour fonctionner sans aucune installation ? Dans le premier cas, voir GnuWin32 référencé ci-dessous ; dans le second, non. Pas de sed natif pré-installé pour Windows.

9 votes

Par natif, j'entends une solution qui fonctionne sur tous les Windows sans installation supplémentaire.

2 votes

Laissez cmd.exe de côté et utilisez PowerShell à la place.

169voto

Jakub Šturc Points 12549

Aujourd'hui, powershell m'a sauvé.

Pour grep il y a :

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

ou

select-string somefile.txt -pattern "expression"

et pour sed il y a :

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

Pour plus de détails sur le remplacement de la fonction PowerShell, voir cet article de Microsoft .

19 votes

En outre : si vous voulez l'appeler à partir de cmd normal, il suffit de @powershell -Command "get-content..." lui. Le seul problème est que vous devez échapper aux guillemets : ... -Command "get-content ... \"expression\",..."

1 votes

@Tarc AFAIR, vous pouvez utiliser des guillemets simples dans votre commande et utiliser des guillemets doubles pour citer la commande à la place.

3 votes

J'ai essayé cela aujourd'hui sur un fichier pour supprimer quelques trucs entre guillemets à certains endroits, pour découvrir que le résultat était un fichier presque deux fois plus gros que l'original. La raison semble être que cette méthode modifie la façon dont les nouvelles lignes sont gérées dans le fichier pour utiliser " \r\n " au lieu de " \n ".

110voto

bill weaver Points 2524

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

Si vous ne voulez rien installer et que votre système n'est pas un Windows Server, alors vous pouvez pourrait Utilisez un langage de script (VBScript par exemple) pour cela. Vous trouverez ci-dessous un exemple brut de ce type. 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 Microsoft vbscript . Évidemment, je n'ai mis en œuvre que la commande de substitution et j'ai supposé certaines choses, mais vous pouvez l'étoffer pour qu'il soit plus intelligent et qu'il comprenne davantage le processus de l sed en 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

1 votes

Ce n'est pas exactement ce que je veux, mais je pense que la dépendance à VBS est la solution la plus légère.

0 votes

En tout cas, merci beaucoup à vous et à tous les autres pour les réponses.

7 votes

GnuWin32 es une solution native, si par native vous entendez conçue pour fonctionner dans l'environnement Windows "normal" (contrairement à CygWin). Essayez-les, et vous commencerez à vous attendre à ce qu'ils soient sur CHAQUE système Windows que vous utilisez. ! !!

23voto

Adam Hughes Points 2402

UnxUtils fournit sed pour Win32, comme le fait GNUWin32 .

18voto

Robert Points 128

Si vous ne voulez rien installer (je suppose que vous voulez ajouter le script dans une solution/programme/etc qui sera exécuté dans d'autres machines), vous pourriez essayer de créer un vbs script (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 tu l'exécutes comme ça :

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 (' > < / ).

En fait, ce n'est pas moi qui l'ai écrit, mais je ne me rappelle pas où je l'ai trouvé.

5voto

robintw Points 7068

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X