Question

J'ai un petit utilitaire qui effectue une recherche dans plusieurs fichiers. Je devais le créer parce que Google & amp; Les recherches sur le bureau Windows ne trouvaient pas les lignes appropriées dans les fichiers. La recherche fonctionne bien (je suis disposé à l’améliorer), mais l’une des choses que j’aimerais ajouter à mon util est une recherche / remplacement par lots.

Alors, quel serait le meilleur moyen de lire une ligne d'un fichier, de le comparer à un terme de recherche et, le cas échéant, de le mettre à jour, puis de mettre à jour la ligne et de poursuivre le reste du fichier?

Était-ce utile?

La solution

Je ferais ce qui suit pour chaque fichier:

  • Effectuez la recherche normalement. Vérifiez également le jeton à remplacer. Dès que vous l'avez vu, redémarrez ce fichier. Si vous ne voyez pas le jeton à remplacer, vous avez terminé.
  • Lorsque vous redémarrez, créez un nouveau fichier et copiez chaque ligne lue dans le fichier d'entrée, en effectuant le remplacement au fur et à mesure.
  • Quand vous avez fini avec le fichier:
    • Déplacez le fichier actuel vers un nom de fichier de sauvegarde
    • Déplacez le nouveau fichier vers le nom de fichier d'origine
    • Supprimer le fichier de sauvegarde

Veillez toutefois à ne pas faire cela sur des fichiers binaires, etc. Les conséquences de la recherche textuelle et du remplacement de fichiers binaires seraient généralement catastrophiques!

Autres conseils

Si PowerShell est une option, la fonction définie ci-dessous peut être utilisée pour rechercher et remplacer des fichiers. Par exemple, pour rechercher 'une chaîne' dans les fichiers texte du répertoire en cours, procédez comme suit:

dir *.txt | FindReplace 'a string'

Pour remplacer 'une chaîne' par une autre valeur, ajoutez simplement la nouvelle valeur à la fin:

dir *.txt | FindReplace 'a string' 'replacement string'

Vous pouvez également l'appeler sur un seul fichier à l'aide de FindReplace -path MyFile.txt 'une chaîne' .

function FindReplace( [string]$search, [string]$replace, [string[]]$path ) {
  # Include paths from pipeline input.
  $path += @($input)

  # Find all matches in the specified files.
  $matches = Select-String -path $path -pattern $search -simpleMatch

  # If replacement value was given, perform replacements.
  if( $replace ) {
    # Group matches by file path.
    $matches | group -property Path | % {
      $content = Get-Content 

Si PowerShell est une option, la fonction définie ci-dessous peut être utilisée pour rechercher et remplacer des fichiers. Par exemple, pour rechercher 'une chaîne' dans les fichiers texte du répertoire en cours, procédez comme suit:

dir *.txt | FindReplace 'a string'

Pour remplacer 'une chaîne' par une autre valeur, ajoutez simplement la nouvelle valeur à la fin:

dir *.txt | FindReplace 'a string' 'replacement string'

Vous pouvez également l'appeler sur un seul fichier à l'aide de FindReplace -path MyFile.txt 'une chaîne' .

<*>

Notez que Select-String prend également en charge les correspondances regex, mais a été contraint aux correspondances simples pour des raisons de simplicité;) Vous pouvez également effectuer un remplacement plus robuste tel que Jon suggéré, plutôt que de simplement remplacer le fichier par le nouveau contenu.

.Name # Replace all matching lines in current file. foreach( $match in

Si PowerShell est une option, la fonction définie ci-dessous peut être utilisée pour rechercher et remplacer des fichiers. Par exemple, pour rechercher 'une chaîne' dans les fichiers texte du répertoire en cours, procédez comme suit:

dir *.txt | FindReplace 'a string'

Pour remplacer 'une chaîne' par une autre valeur, ajoutez simplement la nouvelle valeur à la fin:

dir *.txt | FindReplace 'a string' 'replacement string'

Vous pouvez également l'appeler sur un seul fichier à l'aide de FindReplace -path MyFile.txt 'une chaîne' .

<*>

Notez que Select-String prend également en charge les correspondances regex, mais a été contraint aux correspondances simples pour des raisons de simplicité;) Vous pouvez également effectuer un remplacement plus robuste tel que Jon suggéré, plutôt que de simplement remplacer le fichier par le nouveau contenu.

.Group ) { $index = $match.LineNumber - 1 $line = $content[$index] $updatedLine = $line -replace $search,$replace $content[$index] = $updatedLine # Update match with new line value. $match | Add-Member NoteProperty UpdatedLine $updatedLine } # Update file content. Set-Content

Si PowerShell est une option, la fonction définie ci-dessous peut être utilisée pour rechercher et remplacer des fichiers. Par exemple, pour rechercher 'une chaîne' dans les fichiers texte du répertoire en cours, procédez comme suit:

dir *.txt | FindReplace 'a string'

Pour remplacer 'une chaîne' par une autre valeur, ajoutez simplement la nouvelle valeur à la fin:

dir *.txt | FindReplace 'a string' 'replacement string'

Vous pouvez également l'appeler sur un seul fichier à l'aide de FindReplace -path MyFile.txt 'une chaîne' .

<*>

Notez que Select-String prend également en charge les correspondances regex, mais a été contraint aux correspondances simples pour des raisons de simplicité;) Vous pouvez également effectuer un remplacement plus robuste tel que Jon suggéré, plutôt que de simplement remplacer le fichier par le nouveau contenu.

.Name $content } } # Return matches. $matches }

Notez que Select-String prend également en charge les correspondances regex, mais a été contraint aux correspondances simples pour des raisons de simplicité;) Vous pouvez également effectuer un remplacement plus robuste tel que Jon suggéré, plutôt que de simplement remplacer le fichier par le nouveau contenu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top