Comment puis-je remplacer les dix premiers caractères d'une ligne où ces dix caractères correspondent à un motif particulier avec les dix premiers caractères de la ligne ci-dessus? Edit: Il n'était pas clair si je demandais de remplacer les dix premiers caractères où la correspondance pourrait apparaître n'importe où dans la ligne, alors peut-être faire une note dans votre réponse si elle traite de ce cas (appelez ce cas B ? et destiné un cas A)Remplacer le texte de la ligne ci-dessus dans Vim
Répondre
Prehaps:
:%s/^\(.\{10}\)\(.*\n\)abcdefghij\(.*\)/\1\2\1\3/
Où abcdefghij 'est la chaîne de 10 caractères sur la 2ème ligne
Vous pouvez utiliser la recherche et remplacer:
:7,9 s/foo/bar/c
Cet exemple recherche de la ligne 7 à 9 pour chaque occurrence de « foo », et le remplace par « bar », demander une confirmation sur chaque coup. Si vous ne voulez pas confirmer, déposez le c à la fin. Choisissez la plage comme bon vous semble et cela devrait vous rendre où vous voulez
C'est exactement ce que je cherchais! Merci! –
Si j'ai un complexe action comme ça, je enregistre habituellement une macro en utilisant la commande q
. Quelque chose comme (non testé):
/<pattern>
qq
10x
k
10yl
j
P
n
q
question
Et puis repeatedy cette macro comme @q
préfixé en option avec un compte.
En utilisant uniquement les mouvements de vim et Emmener/coller .. Vu le contenu du fichier de ..
1234567890abcdef
qwertyuiopasdfgh
Avec le curseur sur q, 10x
, fichier devient:
1234567890abcdef
asdfgh
Déplacer le curseur sur la première ligne (en utilisant k
le fera), puis faire 10yl
(yank 10 caractères, droite)
Puis reculer d'une ligne, j
et coller P
(majuscules, pour coller sous le curseur) et le fichier devient:
1234567890abcdef
1234567890asdfgh
En bref, en commençant par le curseur sur q:
10xk10yljP
..which vous pouvez coller , ou affecter to a macro
Il serait plus court s'il y avait un raccourci évident pour coller en réécrivant, mais je ne pouvais pas trouver une telle chose
Une autre option est une recherche très obscure recherche regex/remplacer ..
visuelle en ligne sélectionner les deux lignes cibles, et lancez la recherche et de remplacement suivant:
:'<,'>s/\(\(.\{10\}\).*\)\n\(.\{10\}\)\(.*\)$/\1\r\2\4/
Fondamentalement, il saisit ..
\1
- la totalité de la première ligne\2
- les 10 premiers caractères (dans un groupe imbriqué)- un linebreak
\3
- les dix premiers caractères de la ligne deux\4
- la reste de la deuxième ligne
Puis il construit les deux lignes comme \1\n\2\4
- première ligne complète, linebreak, 10 premiers caractères du premier, le reste de la deuxième
Quelque chose comme ça travailleraient:
%s/^.\{10\}/\=strpart(get(getbufline("", line(".")-1), 0, ""), 0, 10)/
où ^.\{10\}
est votre modèle actuel.
%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,$
est notre gamme (comme la première ligne n'a pas de ligne précédente)g//
vous permet d'exécuter une commande sur les lignes qui correspondent à un modèle donné.s/^.\{10}/
remplacera les 10 premiers caractères d'une ligne\=
vous permet de substituer le résultat d'une expression vim dans un:s//
line(".")
est le numéro de ligne en coursgetline(line(".")-1)
est le texte de la ligne précédentestrpart(getline(line(".")-1),0,10)
est les 10 premiers caractères de la ligne précédente
Par exemple 2,$g/frog/s/^.\{10}/\=strpart(getline(line(".")-1),0,10)
va changer:
I like eating mangos before frying frogs legs I wish I had a puppy She gave Dad a frog
à ceci:
I like eating mangos I like eating frogs legs I wish I had a puppy I wish I had a frog
Que faire si le motif que vous voulez faire correspondre n'est pas les 10 premiers caractères de cette ligne? Cela peut ne pas fonctionner dans ce cas. –
@B Johnson la question indique que les 10 caractères sont au début de la ligne. – besen
Nice. Je ne savais pas que les regex de Vim pouvaient couvrir des lignes. – rampion