Ersetzen von Text in einer Datei mit einer bestimmten Breite

Ersetzen von Text in einer Datei mit einer bestimmten Breite

Wie kann ich an bestimmten Spaltenpositionen ersetzen?

Beispiel: Ich möchte die Spalten 20-26 durch Nullen ersetzen.

Aus:

12345678123456781234567812345678123456781234567812345678123456781234567812345678    

Zu:

12345678123456781234000000345678123456781234567812345678123456781234567812345678

Dies würde für jede Zeile in einer Datei gelten, die Zehntausende solcher Zeilen enthalten könnte.

Antwort1

Ich kenne kein bestimmtes, aber ich habe gerade eines für Sie geschrieben. Es steht inautoit. Sie können es herunterladen und selbst kompilieren, indem Sie den untenstehenden Code verwenden, oder Sie können eine kompilierte Version herunterladenHier. Wenn Sie Änderungen wünschen, lassen Sie es mich einfach wissen und ich werde sehen, was ich tun kann.

BEARBEITEN: Wenn Sie dies auch mit einer Datei tun müssen, lassen Sie es mich wissen, ich kann diese Änderung vornehmen.

BEARBEITEN #2: Ich habe es gerade aktualisiert, um Dateien zu verarbeiten (ich wusste nicht, welche Formate Sie benötigen, bin mir aber nicht sicher, wie einfach es sein wird, etwas anderes als Text-/Protokolldateien zu verarbeiten). Es wird jede Zeile melden, die außerhalb des zulässigen Bereichs liegt. Außerdem habe ich den obigen Link mit der neuen kompilierten Version aktualisiert.

#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GuiEdit.au3>
#include <File.au3>

Dim $s_Name = "FileStringReplacer"

Main()

Func Main()
    $h_Parent = GuiCreate($s_Name,400,340)
    GuiCtrlCreateLabel("File to Edit",5,5,90,20)
    $in_File = GuiCtrlCreateInput("",10,25,380,20,$ES_READONLY)
    $bt_Browse = GuiCtrlCreateButton("Find File",10,50,380,25)
    GuiCtrlCreateLabel("Request Status",5,80,90,20)
    $ed_Status = GuiCtrlCreateEdit("",10,100,380,100,$ES_READONLY + $WS_VSCROLL)
    GuiCtrlCreateLabel("Start Point",5,210,50,20)
    $in_Start = GuiCtrlCreateInput("",60,210,25,20)
    GuiCtrlCreateLabel("Stop Point",95,210,50,20)
    $in_Stop = GuiCtrlCreateInput("",150,210,25,20)
    GuiCtrlCreateLabel("Text to Insert",5,240,90,20)
    $in_String = GuiCtrlCreateInput("",10,260,380,20)
    $bt_Replace = GuiCtrlCreateButton("Replace",10,290,380,25)
    GuiSetState()
    Do
        $Msg = GUIGetMsg()

        If $Msg = $bt_Browse Then
            $h_File = FileOpenDialog("File to Modify",@MyDocumentsDir,"Text (*.txt;*.log)", 3)
            GuiCtrlSetData($in_File,$h_File)
        EndIf

        If $Msg = $bt_Replace Then
            GuiCtrlSetData($ed_Status,"")
            If GuiCtrlRead($in_File) <> "" Then
                If IsInt(Int(GuiCtrlRead($in_Start))) and IsInt(Int(GuiCtrlRead($in_Stop))) and Int(GuiCtrlRead($in_Start)) <> 0 and Int(GuiCtrlRead($in_Stop)) <> 0 Then
                    GuiCtrlSetState($bt_Browse,$GUI_DISABLE)
                    GuiCtrlSetState($bt_Replace,$GUI_DISABLE)
                    $h_File = FileOpen(GuiCtrlRead($in_File))
                    $i = 1
                    $s_Line = ""
                    While 1
                        $s_Line = FileReadLine($h_File,$i)
                        If @error Then
                            ExitLoop
                        EndIf
                        If StringLen($s_Line) > GuiCtrlRead($in_Stop) - GuiCtrlRead($in_Start) Then
                        $stringright = StringTrimLeft($s_Line,GuiCtrlRead($in_Stop))
                        $stringleft = StringLeft($s_Line,GuiCtrlRead($in_Start) -1 )
                        $newstring = $stringleft & GuiCtrlRead($in_String) & $stringright
                        _FileWriteToLine(GuiCtrlRead($in_File), $i, $newstring, 1)
                        Else
                            _GUICtrlEdit_AppendText(GuiCtrlGetHandle($ed_Status), @CRLF & "Edit to line " & $i & " failed, specified position is out of range")
                        EndIf
                        $i = $i + 1
                    WEnd
                    FileClose($h_File)
                    GuiCtrlSetState($bt_Browse,$GUI_ENABLE)
                    GuiCtrlSetState($bt_Replace,$GUI_ENABLE)
                Else
                    GuiCtrlSetData($ed_Status,"Error 102" & @CRLF & "Start and stop points must be numbers")
                EndIf
            Else
                GuiCtrlSetData($ed_Status,"Error 101" & @CRLF & "You must specify a file to edit")
            EndIf
        EndIf
        Until $Msg = $GUI_EVENT_CLOSE
    GUIDelete($h_Parent)
EndFunc

Antwort2

In jedem Texteditor sollte das ganz einfach sein. In gvim könnte der Befehl für die aktuelle Zeile lauten:020lc6l000000<esc>

Gibt es einen besonderen Grund, warum Sie reguläre Ausdrücke vermeiden möchten?


BEARBEITEN

Hier ist eine Anweisung, die einen einfachen regulären Ausdruck enthält:s/^(.{19}).{6}/${1}000000/

Es bedeutet Suche nach

^      start at the beginning of a line
(      remember stuff found between parentheses
.      any single character
{19}   exactly 19 of them
)      end of the part we want to remember
.{6}   followed by any 6 characters which we won't remember

und ersetzen Sie sie durch

${1}   the first set of characters we remembered using () - 19 chars
000000 followed by six zeros (replacing the .{6} we ignore)

normalerweise würden Sie ${1}„as“ schreiben $1, aber wenn darauf Ziffern folgen, müssen Sie {} verwenden, um zwischen dem zehnten gespeicherten Teil $1 und dem ersten Teil $1 gefolgt von einer wörtlichen 0 zu unterscheiden.

So verwendet

perl -pie 's/^(.{19}).{6}/${1}000000/' foo.txt bar.txt any*.txt

um alle Zeilen in einer beliebigen Anzahl von Dateien direkt zu bearbeiten.Aber testen Sie es zuerst an einer Kopie der Datei!

Antwort3

Antwort4

Vimkann dies ganz einfach tun.

Öffnen Sie die Datei in Vim und geben Sie dann ein:

:% normal 019l6r0<Enter>



:% normalbedeutet, dass die nächsten Befehle in jeder Zeile der Datei ausgeführt werden.

0bedeutet: Bewegen Sie den Cursor an den Zeilenanfang.

19lbedeutet: den Cursor 19 mal nach rechts bewegen

6r0bedeutet: Ersetze die nächsten 6 Zeichen durch 0


Ich weiß, dass die Befehle auf den ersten Blick etwas kryptisch aussehen könnten. Aber Sie müssen nur ein paar sehr einfache Befehle lernen, um das zu tun, was Sie brauchen.

0bewegt den Cursor an den Anfang der Zeile
$bewegt den Cursor an das Ende der Zeile

hbewegt den Cursor nach links
jbewegt den Cursor nach unten
kbewegt den Cursor nach oben
lbewegt den Cursor nach rechts

rersetzt das Zeichen unter dem Cursor durch das nächste gedrückte Zeichen

Geben Sie vor jedem Befehl eine Zahl ein, um den Befehl „Anzahl“ Mal auszuführen.

:% normal <list of commands><Enter>erstellt eine Liste von Befehlen in jeder Zeile der Datei


Sie können auch eine Reihe von Änderungen aufzeichnen und dann dieselben Änderungen in jeder Zeile der Datei wiedergeben.

Befehle aufzeichnen.

qa<commands>q

Geben Sie dann die Befehle in jeder Zeile der Datei erneut wieder.

:% normal @a<Enter>

verwandte Informationen