Domanda

Come posso sostituire i primi dieci caratteri di una riga in cui quei dieci caratteri corrispondono a un modello particolare con i primi dieci caratteri della riga sopra?

Modifica: non era chiaro se stavo chiedendo di sostituire i primi dieci caratteri in cui la partita potesse apparire in qualsiasi punto all'interno della linea, quindi forse prendi nota nella tua risposta se si tratta di questo caso (chiama questo caso B e il caso previsto A?)

È stato utile?

Soluzione

Prehaps:

:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/

Dove 'abcdefghij' è la stringa di 10 caratteri sulla seconda riga

Altri suggerimenti

Qualcosa del genere funzionerebbe:

%s/^.\{10\}/\=strpart(get(getbufline("", line(".")-1), 0, ""), 0, 10)/

dove ^. \ {10 \} è il tuo modello reale.

%s/                      # substitute all lines matching…
^.\{10\}                 # your pattern
/                        # …with…
\=                       # an expression:
strpart(                 # gets the part of a string
  get(                   # gets an element of a list
    getbufline(          # gets a list of lines from the current buffer
      "", line(".")-1)   # getbufline() the line before the current line
  , 0, "")               # get() first line in buffer, default to ""
, 0, 10)                 # strpart() first ten characters
/                        # …end of substitution
:2,$g/<pattern>/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
  • 2, $ è il nostro intervallo (poiché la prima riga non ha una riga precedente)
  • g // ti consente di eseguire un comando su righe che corrispondono a un determinato modello.
  • s / ^. \ {10} / sostituirà i primi 10 caratteri di una riga
  • \ = ti consente di sostituire il risultato di un'espressione vim in un :s//
  • line (". ") è il numero di riga corrente
  • getline (line (". ") - 1) è il testo della riga precedente
  • strpart (getline (line (". ") - 1), 0,10) sono i primi 10 caratteri della riga precedente

Ad esempio 2, $ g / frog / s / ^. \ {10} / \ = strpart (getline (line (". ") - 1), 0,10) cambierà:

I like eating mangos
before frying frogs legs
I wish I had a puppy
She gave Dad a frog

A questo:

I like eating mangos
I like eating frogs legs
I wish I had a puppy
I wish I had a frog

Se ho un'azione complessa come quella di solito registro una macro usando il comando q . Qualcosa di simile (non testato):

/<pattern>
qq
10x
k
10yl
j
P
n
q

E quindi rilasciare ripetutamente quella macro come @q con il prefisso facoltativo con un conteggio.

È possibile utilizzare la ricerca e sostituire:

:7,9 s/foo/bar/c

Questo esempio cerca dalla riga 7 alla 9 ogni occorrenza di "pippo" e lo sostituisce con "barra", chiedendo una conferma per ogni colpo. Se non si desidera confermare, rilasciare la c alla fine. Scegli l'intervallo che ritieni opportuno e questo dovrebbe portarti dove vuoi

Usando solo i movimenti di vim e yanking / incolling .. Dato il contenuto del file di ..

1234567890abcdef
qwertyuiopasdfgh

Con il cursore su q, 10x , il file diventa:

1234567890abcdef
asdfgh

Sposta il cursore sulla prima riga (usando k ), quindi esegui 10yl (yank 10 caratteri, a destra)

Quindi torna indietro di una riga, j e incolla P (maiuscolo, per incollare sotto il cursore) e il file diventa:

1234567890abcdef
1234567890asdfgh

In breve, a partire dal cursore su q:

10xk10yljP

..che potresti incollare o assegnare a una macro

Sarebbe più breve se ci fosse un'ovvia scorciatoia da incollare sovrascrivendo, ma non riuscivo a trovare una cosa del genere

Un'altra opzione è una ricerca / sostituzione regex dall'aspetto incredibilmente oscuro

Visual-line seleziona le due linee target ed esegui la seguente ricerca e sostituzione:

:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/

Praticamente prende ..

  • \ 1 - l'intera prima riga
  • \ 2 - i primi 10 caratteri (in un gruppo nidificato)
  • una interruzione di riga
  • \ 3 - i primi dieci caratteri della riga due
  • \ 4 - il resto della seconda riga

Quindi costruisce le due righe come \ 1 \ n \ 2 \ 4 - completa la prima riga, l'interruzione di riga, i primi 10 caratteri del primo, il resto del secondo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top