Remplacer l'expression régulière à partir de la ligne de commande

21

Est-il possible de remplacer regex à partir de la ligne de commande? En ce moment, j'utilise notepad ++ pour ce faire. En ligne de commande, je ne peux utiliser que FINDSTR qui ne peut que localiser les fichiers / lignes usinés

EDIT:
Peut - être qu'il sera possible de créer un script VB et de l'exécuter à partir de cmd? Je viens de créer un fichier "hi.vbs" avec le contenu

Msgbox "Hi Buddy"

Ensuite, cmd me permet de l'exécuter directement en tapant "hi" à partir de la ligne de commande.
Donc, si ce n'est pas possible avec un script de traitement par lots, alors je peux utiliser un traitement par lot de scripts VB. Ou..?

Aziz
la source
À la fin, vous mettez une phrase non concluante et toute la partie EDIT ne pointe pas vers le problème est plus comme "Je crée un monde bonjour en vb, puis-je créer quelque chose comme ça en lot? Vérifiez la réponse publiée par @IanPugsley est le moyen facile de remplacer regex
mjsr
@Aziz: l'une de ces réponses a-t-elle fonctionné pour vous? Si oui, l'accepteriez-vous? Cela fait partie de la participation à cette communauté; la façon dont nous nous remercions pour l'aide. Les points de réputation attribués pour une réponse acceptée aident les autres utilisateurs à évaluer leur expérience mutuelle. Merci.
JRobert
Je pensais appeler quelque chose comme MYVBREPLACE (.vbs) FILENAME REGEXPATTERN REPLACEMENT à partir de la ligne de commande.
Aziz

Réponses:

11

allez ici
http://gnuwin32.sourceforge.net/packages.html faites
défiler jusqu'à SED. Téléchargez également coreutils pendant que vous y êtes.

cette commande remplacera a par b globalement et sur chaque ligne. donc pas seulement la première occurrence sur la ligne.

par exemple en utilisant sed "s / a / b / g" a.txt

C:\>type a.txt
aaaa
aaa

C:\>sed "s/a/b/" a.txt
baaa
baa

C:\>sed "s/a/b/g" a.txt
bbbb
bbb

C:\>

VBScript prend en charge les expressions régulières, vous pouvez le rechercher et le remplacer.

dim re, s
set re = new RegExp

re.Pattern="in"
re.Global=True 'false is default
s="bin din in"
MsgBox re.Replace(s,"xxx")

Affiche bxxx dxxx xxx

barlop
la source
Outil fou incroyable !!! Cet outil était trop avancé. Je n'ai pas encore réussi à l'utiliser, mais quand j'ai lu gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command, je peux voir que cela peut faire beaucoup plus que ce à quoi je pouvais m'attendre. Merci beaucoup
Aziz
Les nouvelles versions de bash peuvent également faire des expressions régulières, parfois cela suffit pour des tâches simples et il n'est pas nécessaire d'utiliser même sed.
vtest
et ce que vtest a dit, au cas où quelqu'un ne le sait pas. cygwin a bash.
barlop
sed suce avec des remplacements multi-lignes
kofifus
1
Shell @KennyEvitt cmd a besoin d' un coup sec pour l' obtenir pour afficher et l' utilisation de chcp pour unicode UTF8 chcp 65001 (comme vous le dites, utf16 encoding.chcp 1200 et chcp 12001 ne sont pas pris en charge) stackoverflow.com/questions/9321419/...~~V~~singular~~3rd Je ne sais pas re mentholée. Je ne suis pas sûr de la PowerShell. Mais utf-8 est supporté ok en cmd ou powershell. Tant qu'une police de support est utilisée comme Courier new, et tant qu'elle est à la page de code 65001. Il y a un cmd / u pour un encodage utf16.
barlop
26

J'ai écrit un outil de ligne de commande gratuit pour Windows pour ce faire. Il s'appelle rxrepl , il prend en charge Unicode et la recherche de fichiers. Certains peuvent trouver cela utile.

rxrepl est un outil en ligne de commande de Microsoft Windows pour rechercher et remplacer du texte dans des fichiers texte à l'aide d'expressions régulières compatibles Perl (PCRE).

Il présente les fonctionnalités suivantes:

  • Recherche à l'aide d'expressions régulières compatibles Perl
  • Utiliser la correspondance de groupe dans le texte de remplacement
  • Prise en charge des fins de ligne Windows et Unix
  • Prise en charge Unicode
  • Accepte plusieurs arguments de recherche / remplacement
  • Les options peuvent être fournies dans un fichier d'options
  • Rechercher des fichiers
  • Mode aperçu
  • Modes de correspondance de ligne et de fichier complet

entrez la description de l'image ici

user2005187
la source
4
Ceci est incroyable! Si vous êtes comme moi et que vous avez besoin d'exemples, cela remplace "foobar" par "foofighters" dans un fichier: rxrepl.exe -f file.txt -a -s "(foo) bar" -r "\ 1fighters"
Dunc
1
De plus, auriez-vous la source sur quelque chose comme github? Totalement compréhensible si ce n'est pas censé être open source, mais je suis très curieux.
kayleeFrye_onDeck
1
@Steztric Vraiment? C:\WINDOWS\System32\cmd.exe
J'exécute
1
Outil génial! Fonctionnement sans problème sous Windows Server Std 2012 R2 x64. THX!
kwrl
2
Excellent outil, j'espère que vous le maintenez toujours
liquide
12

Le Scripting Guy explique comment procéder dans PowerShell (aucun téléchargement supplémentaire sur les systèmes d'exploitation Windows les plus récents, vous l'avez probablement déjà installé).

Démarrez-le, exécutez ce qui suit (pour remplacer a *par a @):

(Get-Content C:\Scripts\Test.txt) | 
Foreach-Object {$_ -replace "\*", "@"} | 
Set-Content C:\Scripts\Test.txt

Cela prend en charge les expressions régulières .NET , y compris l'anticipation positive et négative, et toutes sortes de choses que notepad ++ ne supportait pas avec regex avant la version 6.x (autant que j'aime notepad ++).

Ian Pugsley
la source
1
Notepad ++ prend en charge PCRE complet à partir de la version 6.
Bob
5

J'ai trouvé fnr.exe pour cela. Il a une interface graphique et une ligne de commande.

Un outil open source pour rechercher et remplacer du texte dans plusieurs fichiers.

traits

  • Téléchargement de fichier unique - fnr.exe (127kb)
  • Remplacer le texte dans plusieurs fichiers à l'aide de l'application Windows ou via la ligne de commande
  • Rechercher uniquement pour voir où les correspondances sont trouvées
  • Recherche sensible à la casse
  • Recherche de fichiers dans un répertoire ou sous-répertoires récurrents
  • Expressions régulières
  • Rechercher et remplacer du texte sur plusieurs lignes
  • Générer un bouton de ligne de commande pour créer un texte de ligne de commande à placer dans un fichier de commandes
  • Aide en ligne de commande
  • Tests unitaires du moteur Rechercher / Remplacer

Affichage des options de ligne de commande

entrez la description de l'image ici

Serge
la source
1
Assez bien - vous pouvez vérifier votre instruction "find" dans l'interface graphique, cliquez sur "Gen Replace Command Line" et préparez-vous à utiliser l'appel de ligne de commande. Pas besoin de passer du temps pour vous familiariser avec la syntaxe de la ligne de commande.
sarh
Je n'ai pas réussi à faire sortir cela après avoir fait les changements. Je dois appuyer sur Entrée pour fermer, ce qui n'est pas particulièrement utile pour les scripts
G-.
@G-. Il n'y a pas d'attente pour <enter> s'il est exécuté à partir d'un fichier de commandes.
Sergius
Je n'ai pas trouvé de moyen de sortir vers un autre nom / extension de fichier
Rick
4

On dirait que vous pouvez utiliser l'expression régulière avec FINDSTR

findstr [Windows CMD] :

findstr permet de rechercher du texte (comme spécifié avec un motif dans le fichier nom-fichier. Si le nom-fichier contient des caractères génériques (* ou?), il recherche dans tous les fichiers qui correspondent. L'option / S recherche dans le répertoire courant ainsi que dans ses sous-répertoires. Si le modèle contient des espaces, il doit être spécifié comme ceci / C: "du texte à rechercher". Pour transformer le modèle en expressions régulières, l'option / R doit être utilisée. L'option / I recherche le cas insensible.

Dans l'aide de FindStr ( Findstr /?):

/ R - Utilise des chaînes de recherche comme expressions régulières.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word
p0rkjello
la source
Merci pour votre réponse, mais ce n'était pas ma question.
Aziz
2
findstrne peut pas remplacer le texte dans les fichiers!
Kenny Evitt
4

Je suis un peu en retard à la fête, mais JREPL.BAT est un utilitaire hybride basé sur JScript / script batch qui s'exécute nativement sur n'importe quelle machine Windows à partir de XP.

Une documentation complète est intégrée au script, accessible via JREPL /?ou utilisée JREPL /??pour la sortie paginée.

JREPL utilise une expression régulière ECMA standard fournie avec JScript. Les expressions régulières ECMA ne sont pas aussi puissantes que les expressions régulières .NET disponibles pour PowerShell, mais elles sont encore plutôt bonnes. Et je pense que l'utilisateur moyen trouvera cet utilitaire plus facile à utiliser que PowerShell.

Les options JREPL intégrées fournissent déjà beaucoup de puissance inhérente, mais la possibilité d'injecter du JScript fourni par l'utilisateur ouvre vraiment des possibilités incroyables.

J'ai développé le script parce que mon lieu de travail ne permet pas le téléchargement de fichiers exe non standard, mais n'a aucune restriction sur l'écriture de scripts batch ou JScript :-)

Suivez simplement le lien et copiez le code du script dans un fichier nommé JREPL.BAT. Lisez les articles suivants de ce fil pour des exemples d'utilisation et d'historique de développement. Il existe également de nombreuses réponses StackOverflow qui utilisent JREPL.BAT.

dbenham
la source
3

Deux bons choix sont soit Cygwin qui vous donnera un environnement semblable à Unix, bash (alternative à cmd.exe); et Unxutils , ports Win32 d'une collection d'utilitaires Unix individuels. Dans les deux packages, voir «sed», «awk» et «grep».

JRobert
la source
2
unxutils est vieux. maintenant la chose est gnuwin32
barlop
Merci JRobert pour votre suggestion. Désolé de ne pas l'avoir compris, mais maintenant je peux voir que SED était la chose.
Aziz
@barlop à partir de 2018, gnuwin32 est désormais aussi ancien. cygwin est plus à jour!
barlop
0

Vous pouvez également utiliser GSAR pour effectuer une recherche et un remplacement en ligne de commande. Fonctionne également avec hexadécimal et binaire. Il ne fera pas le levage de charges lourdes complexe que regex peut effectuer, mais pour la recherche de base et le remplacement, il fait le travail rapidement et facilement.

Soleil
la source