2009-07-12 72 views
22

我想創建一個批處理,同時在批處理文件中查找特定的行並能夠編輯這些行。在TXT文件批處理/查找和編輯行

例子:

// txt文件//

ex1 
ex2 
ex3 
ex4 

我希望讓該批處理文件找到 'EX3' 和編輯本 '的EX5',讓它看起來像這樣:

ex1 
ex2 
ex5 
ex4 
+20

它看起來很清楚,如果我說'BATCH' – 2009-07-12 09:14:14

回答

27

在本地Windows安裝上,您可以使用批處理(cmd.exe)或vbscript,而無需獲取外部工具。 這裏是在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  

另存爲myreplace.vbs和命令行

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

這是一種東西sed是作了(當然,你需要sed在你的系統上)。

SED的/ EX3/EX5/G'input.txt中> output.txt的

你要麼需要一個Unix系統或Windows Cygwin樣的平臺這一點。
還有GnuWin32 for sed。 (GnuWin32 installation and usage)。

+0

這是我需要的東西太多。我想設置這個公衆;所以它應該輕鬆完成。 – 2009-07-12 08:30:24

12

上的例子沒有搜索,並在XP或2K3命令行替換功能或流編輯(不要了解Vista或更高版本)。所以,你需要使用一個像Ghostdog發佈的腳本,或者搜索並替換sed等有用的工具。

不止一種方法去做一件事,因爲這腳本顯示:

@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 
11

ghostdog74的例子提供了我需要的核心,因爲我以前從未編寫過任何VBS要做到這一點需要。這不是完美的,但我充實了這個例子到一個完整的腳本,以防有人發現它有用。

'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 
5

您可以隨時使用「FAR」=「查找和替換」。它是用java編寫的,所以它在Java工作的地方工作(幾乎在任何地方)。與目錄和子目錄一起工作,搜索和替換文件,也可以重命名它們。也可以重新命名批量文件.Licence =免費,適用於個人或公司。非常快,由開發人員維護。在這裏找到它:http://findandreplace.sourceforge.net/

也可以使用GrepWin。工作幾乎相同。你可以在這裏找到它:http://tools.tortoisesvn.net/grepWin.html

6

如果您使用的是Windows,你可以使用FART˚F IND 一個第二[R E放置牛逼分機)。它只有一個* .exe文件(不需要庫)。

所有你需要運行:

fart.exe your_batch_file.bat ex3 ex5 
+2

他們不得不堅持** T **結束,不是嗎? :) – akinuri 2017-11-16 07:26:13

0

你可以這樣做:

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 
2
@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。希望它能幫助一些人。