バッチ ファイル内の特定の行を検索し、これらの行を編集できるバッチを作成したいと考えています。
例:
//TXTファイル//
ex1
ex2
ex3
ex4
バッチファイルに「ex3」を見つけさせ、これを「ex5」に編集して、次のようにしたい:
ex1
ex2
ex5
ex4
バッチ ファイル内の特定の行を検索し、これらの行を編集できるバッチを作成したいと考えています。
例:
//TXTファイル//
ex1
ex2
ex3
ex4
バッチファイルに「ex3」を見つけさせ、これを「ex5」に編集して、次のようにしたい:
ex1
ex2
ex5
ex4
ネイティブ 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
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
これまで vbs を書いたことがなく、それを行う必要があったため、ghostdog74 の例は私が必要としていたものの中核を提供してくれました。完璧ではありませんが、誰かが役に立つと思う場合に備えて、例を完全なスクリプトに肉付けしました.
'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
Windows を使用している場合は、FART ( F ind A nd Replace Text )を使用できます。1 つの *.exe ファイルのみです (ライブラリは必要ありません)。
実行する必要があるのは次のとおりです。
fart.exe your_batch_file.bat ex3 ex5
「FAR」=「検索と置換」はいつでも使用できます。これは Java で書かれているため、Java が動作する場所 (ほぼどこでも) で動作します。ディレクトリとサブディレクトリを操作し、ファイル内を検索して置換し、名前を変更することもできます。また、一括ファイルの名前を変更することもできます。ライセンス = 無料、個人または企業の両方。非常に高速で、開発者によって維持されます。ここで見つけてください:http://findandreplace.sourceforge.net/
また、GrepWin を使用することもできます。ほとんど同じように動作します。ここで見つけることができます: http://tools.tortoisesvn.net/grepWin.html
これは、このようなもののために作成されたものsed
です (もちろん、そのためにはシステムに sed が必要です)。
sed 's/ex3/ex5/g' 入力.txt > 出力.txt
これには、Unix システムまたは Windows Cygwinのようなプラットフォームが必要です。sed 用の GnuWin32
もあります。( GnuWin32 のインストールと使用法)。