web-dev-qa-db-fra.com

Batch / Find And Edit Lines in TXT file

Je veux créer un lot tout en trouvant des lignes spécifiques dans un fichier de commandes et pouvoir modifier ces lignes.

Exemple:

// FICHIER TXT //

ex1
ex2
ex3
ex4

je veux laisser le fichier batch trouver 'ex3' et le modifier en 'ex5' pour qu'il ressemble à ceci:

ex1
ex2
ex5
ex4
25
Deniz Zoeteman

Sur une installation native de Windows, vous pouvez utiliser soit batch (cmd.exe) soit vbscript sans avoir besoin d’outils externes. Voici un exemple dans vbscript:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    If InStr(strLine,"ex3")> 0 Then
        strLine = Replace(strLine,"ex3","ex5")
    End If 
    WScript.Echo strLine
Loop    

Enregistrez sous myreplace.vbs et sur la ligne de commande:

c:\test> cscript /nologo myreplace.vbs  > newfile
c:\test> ren newfile file.txt
30
ghostdog74

Il n'y a pas de fonction de recherche et de remplacement ou d'édition de flux sur la ligne de commande en XP ou 2k3 (je ne sais pas pour Vista ou au-delà). Donc, vous devrez utiliser un script comme celui de Ghostdog publié, ou un outil de recherche et de remplacement comme sed.

Il existe plusieurs façons de le faire, comme le montre ce script:

@echo off
    SETLOCAL=ENABLEDELAYEDEXPANSION

    rename text.file text.tmp
    for /f %%a in (text.tmp) do (
        set foo=%%a
        if !foo!==ex3 set foo=ex5
        echo !foo! >> text.file) 
del text.tmp
13
RobW

l'exemple de ghostdog74 a fourni le noyau de ce dont j'avais besoin, car je n'ai jamais écrit aucun vbs auparavant et je devais le faire. Ce n'est pas parfait, mais j'ai étoffé l'exemple dans un script complet au cas où quelqu'un le trouverait utile.

'ReplaceText.vbs

Option Explicit

Const ForAppending = 8
Const TristateFalse = 0 ' the value for ASCII
Const Overwrite = True

Const WindowsFolder = 0
Const SystemFolder = 1
Const TemporaryFolder = 2

Dim FileSystem
Dim Filename, OldText, NewText
Dim OriginalFile, TempFile, Line
Dim TempFilename

If WScript.Arguments.Count = 3 Then
    Filename = WScript.Arguments.Item(0)
    OldText = WScript.Arguments.Item(1)
    NewText = WScript.Arguments.Item(2)
Else
    Wscript.Echo "Usage: ReplaceText.vbs <Filename> <OldText> <NewText>"
    Wscript.Quit
End If

Set FileSystem = CreateObject("Scripting.FileSystemObject")
Dim tempFolder: tempFolder = FileSystem.GetSpecialFolder(TemporaryFolder)
TempFilename = FileSystem.GetTempName

If FileSystem.FileExists(TempFilename) Then
    FileSystem.DeleteFile TempFilename
End If

Set TempFile = FileSystem.CreateTextFile(TempFilename, Overwrite, TristateFalse)
Set OriginalFile = FileSystem.OpenTextFile(Filename)

Do Until OriginalFile.AtEndOfStream
    Line = OriginalFile.ReadLine

    If InStr(Line, OldText) > 0 Then
        Line = Replace(Line, OldText, NewText)
    End If 

    TempFile.WriteLine(Line)
Loop

OriginalFile.Close
TempFile.Close

FileSystem.DeleteFile Filename
FileSystem.MoveFile TempFilename, Filename

Wscript.Quit
11
Eric

Si vous êtes sous Windows, vous pouvez utiliser PET ( [~ # ~] f [~ # ~] ind [~ # ~] a [~ # ~] nd [~ # ~] r [~ # ~] eplace [~ # ~] t [~ # ~] ext). Il ne s'agit que d'un seul fichier * .exe (aucune bibliothèque requise).

Il vous suffit de lancer:

fart.exe your_batch_file.bat ex3 ex5
7
Dio Phung

Vous pouvez toujours utiliser "FAR" = "Rechercher et remplacer". Il est écrit sous Java, donc il fonctionne là où Java fonctionne (à peu près partout). Fonctionne avec les répertoires et sous-répertoires, recherche et remplace dans les fichiers, peut également les renommer. Peut également renommer les fichiers en vrac. Licence = gratuit, pour les particuliers ou les entreprises. Très rapide et maintenu par le développeur. Trouvez-le ici: http://findandreplace.sourceforge.net/

Vous pouvez également utiliser GrepWin. Fonctionne à peu près de la même manière. Vous pouvez le trouver ici: http://tools.tortoisesvn.net/grepWin.html

5
cristic

C'est le genre de choses sed a été fait pour (bien sûr, vous avez besoin de sed sur votre système pour cela).

sed 's/ex3/ex5/g' input.txt> output.txt

Vous aurez besoin d'un système Unix ou d'une plate-forme Windows Cygwin pour cela.
Il y a aussi GnuWin32 pour sed . ( installation et utilisation de GnuWin32 ).

5
nik
@echo off
set "replace=something"
set "replaced=different"

set "source=Source.txt"
set "target=Target.txt"

setlocal enableDelayedExpansion
(
   for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
      set "line=%%b"
      if defined line set "line=!line:%replace%=%replaced%!"
      echo(!line!
   )
) > %target%
endlocal

Source . En espérant que cela aidera quelqu'un.

4
HBK

Vous pouvez faire comme ça:

rename %CURR_DIR%\ftp\mywish1.txt text.txt
for /f %%a in (%CURR_DIR%\ftp\text.txt) do (
if "%%a" EQU "ex3" ( 
echo ex5 >> %CURR_DIR%\ftp\mywish1.txt
) else (
echo %%a >> %CURR_DIR%\ftp\mywish1.txt
)
)
del %CURR_DIR%\ftp\text.txt
1
xpioneer