Lot / Rechercher et modifier des lignes dans le fichier TXT
-
12-09-2019 - |
Question
Je veux créer un lot tout qui trouve des lignes spécifiques dans un fichier de commandes et sont en mesure de modifier ces lignes.
Exemple:
// TXT // FILE
ex1
ex2
ex3
ex4
Je veux laisser le fichier batch trouver « EX3 » et modifier pour « EX5 » de le laisser ressembler à ceci:
ex1
ex2
ex5
ex4
La solution
Sur un natif de Windows installer, vous pouvez utiliser lots (cmd.exe) ou vbscript sans qu'il soit nécessaire d'obtenir des outils externes. Voici un exemple 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
Enregistrer sous myreplace.vbs et sur la ligne de commande:
c:\test> cscript /nologo myreplace.vbs > newfile
c:\test> ren newfile file.txt
Autres conseils
Il n'y a pas de recherche et de remplacer l'édition de fonction ou d'un flux à la ligne de commande dans XP ou 2K3 (ne sais pas à propos de Vista ou au-delà). Ainsi, vous aurez besoin d'utiliser un script comme celui Ghostdog affiché, ou une recherche et remplacer outil capable comme sed.
Il y a plus d'une façon de le faire, comme ce script indique:
@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
L'exemple de ghostdog74 fourni au cœur de ce que je avais besoin, puisque je ne l'ai jamais écrit de vbs avant et avait besoin de le faire. Ce n'est pas parfait, mais j'étoffée l'exemple dans un script complet tout le monde en cas trouve 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
Ce genre de choses sed
a été fait pour (bien sûr, vous avez besoin sur sed votre système pour cela).
sed 's / ex3 / EX5 / g' input.txt> output.txt
Vous aurez soit besoin d'un système Unix ou le type de Windows Cygwin de la plate-forme pour cela.
Il y a aussi GnuWin32 sed. ( GnuWin32 installation et d'utilisation ).
Vous pouvez toujours utiliser « FAR » = « Rechercher et remplacer ». Il est écrit en Java, il fonctionne où Java fonctionne (à peu près partout). Fonctionne avec les répertoires et sous-répertoires, recherches et remplace dans les fichiers, peuvent également les renomme. peut également renommer en vrac files.Licence = libre, pour les particuliers ou comapnies. Très rapide et maintenu par le développeur. Trouvez ici: http://findandreplace.sourceforge.net/
Vous pouvez également utiliser grepWin. Fonctionne à peu près la même chose. Vous pouvez le trouver ici: http://tools.tortoisesvn.net/grepWin.html
@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 qu'il aidera quelqu'un.
Vous pouvez faire comme ceci:
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