Reemplazo de texto en un archivo con cierto ancho

Reemplazo de texto en un archivo con cierto ancho

¿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>



:% normalsignifica ejecutar los siguientes comandos en cada línea del archivo.

0significa: mover el cursor al principio de la línea.

19lsignifica: mover el cursor hacia la derecha 19 veces

6r0significa: 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.

0mueve el cursor al principio de la línea
$mueve el cursor al final de la línea

hmueve el cursor hacia la izquierda
jmueve el cursor hacia abajo
kmueve el cursor hacia arriba
lmueve el cursor hacia la derecha

rreemplaza 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>

información relacionada