¿Cómo puedo reemplazar en ciertas posiciones de las columnas?
Ejemplo: quiero reemplazar las columnas 20-26 con 0.
De:
12345678123456781234567812345678123456781234567812345678123456781234567812345678
A:
12345678123456781234000000345678123456781234567812345678123456781234567812345678
Esto sería para cada línea de un archivo que podría contener decenas de miles de líneas como estas.
Respuesta1
No conozco ninguno específicamente, pero acabo de escribir uno para ti. esta escrito enautoit. Puede descargarlo y compilarlo usted mismo usando el código siguiente, o puede descargar una versión compiladaaquí. Si desea realizar algún cambio, hágamelo saber y veré qué puedo hacer.
EDITAR: si también necesita hacer esto con un archivo, hágamelo saber, puedo hacer ese cambio.
EDITAR #2: Acabo de actualizarlo para hacer archivos (no sabía qué formatos necesitabas, pero no estoy seguro de qué tan fácil será hacer cualquier cosa que no sean archivos de texto/registro). Informará de cualquier línea que esté fuera de rango. También actualicé el enlace de arriba con la nueva versión compilada.
#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
Respuesta2
Debería ser trivial en cualquier editor de texto. En gvim para la línea actual, el comando podría ser020lc6l000000<esc>
¿Existe alguna razón especial por la que desee evitar las expresiones regulares?
EDITAR
Aquí hay una declaración que contiene una expresión regular simple:s/^(.{19}).{6}/${1}000000/
significa buscar
^ 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
y reemplazarlos con
${1} the first set of characters we remembered using () - 19 chars
000000 followed by six zeros (replacing the .{6} we ignore)
normalmente escribirías ${1}
como $1
, pero cuando va seguido de dígitos tienes que usar {} para distinguir entre la décima parte recordada $10 y la primera parte $1 seguida de un 0 literal.
Usado así
perl -pie 's/^(.{19}).{6}/${1}000000/' foo.txt bar.txt any*.txt
para realizar la edición in situ de todas las líneas en cualquier número de archivos.¡Pero pruébelo primero en una copia del archivo!
Respuesta3
Respuesta4
Empujepuede hacer esto muy fácilmente.
Abra el archivo en Vim, luego escriba:
:% normal 019l6r0<Enter>
:% normal
significa ejecutar los siguientes comandos en cada línea del archivo.
0
significa: mover el cursor al principio de la línea.
19l
significa: mover el cursor hacia la derecha 19 veces
6r0
significa: reemplazar los siguientes 6 caracteres con 0
Sé que los comandos pueden parecer un poco crípticos al principio. Pero sólo necesitas aprender algunos comandos muy simples para hacer lo que necesitas.
0
mueve el cursor al principio de la línea
$
mueve el cursor al final de la línea
h
mueve el cursor hacia la izquierda
j
mueve el cursor hacia abajo
k
mueve el cursor hacia arriba
l
mueve el cursor hacia la derecha
r
reemplaza el carácter debajo del cursor con el siguiente carácter presionado
Escriba un número antes de cualquier comando para que ese comando se ejecute "número" de veces.
:% normal <list of commands><Enter>
hace una lista de comandos en cada línea del archivo
También puedes grabar un montón de ediciones y luego reproducir las mismas ediciones en cada línea del archivo.
Grabar comandos.
qa<commands>q
luego, reproduzca los comandos en cada línea del archivo.
:% normal @a<Enter>