web-dev-qa-db-ja.com

TXTファイル内の行のバッチ/検索および編集

バッチファイル内の特定の行を検出し、これらの行を編集できるバッチを作成します。

例:

// TXTファイル//

ex1
ex2
ex3
ex4

バッチファイルに 'ex3'を見つけさせ、これを 'ex5'に編集して、次のようにします。

ex1
ex2
ex5
ex4
25
Deniz Zoeteman

ネイティブWindowsインストールでは、外部ツールを入手する必要なく、batch(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
30
ghostdog74

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
13
RobW

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

Windowsを使用している場合は、 [〜#〜] fart [〜#〜][〜#〜] f [〜#〜]を使用できます= ind [〜#〜] a [〜#〜] nd [〜#〜] r [〜#〜] eplace [〜#〜] t [〜#〜] ext)。単一の* .exeファイルのみです(ライブラリは不要です)。

必要なのは実行するだけです:

fart.exe your_batch_file.bat ex3 ex5
7
Dio Phung

常に「FAR」=「検索と置換」を使用できます。 Javaで書かれているため、Javaはどこでも動作します。ディレクトリとサブディレクトリで動作し、ファイル内で検索および置換し、名前を変更できます。バルクファイルの名前も変更できます。 =無料、個人または企業の両方。非常に高速で、開発者によって管理されています。ここで見つけることができます: http://findandreplace.sourceforge.net/

また、GrepWinを使用できます。ほぼ同じように機能します。ここで見つけることができます: http://tools.tortoisesvn.net/grepWin.html

5
cristic

これは、 sed が作成されたものです(もちろん、そのためにはシステムにsedが必要です)。

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

UnixシステムまたはWindows Cygwin のいずれかのプラットフォームが必要です。
GnuWin32 for sed もあります。 ( 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

ソース 。それが何かを助けることを願っています。

4
HBK

このようにすることができます:

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