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>
:% normal
bedeutet, dass die nächsten Befehle in jeder Zeile der Datei ausgeführt werden.
0
bedeutet: Bewegen Sie den Cursor an den Zeilenanfang.
19l
bedeutet: den Cursor 19 mal nach rechts bewegen
6r0
bedeutet: 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.
0
bewegt den Cursor an den Anfang der Zeile
$
bewegt den Cursor an das Ende der Zeile
h
bewegt den Cursor nach links
j
bewegt den Cursor nach unten
k
bewegt den Cursor nach oben
l
bewegt den Cursor nach rechts
r
ersetzt 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>