J'ai un fichier avec un tas de valeurs par défaut de l'utilisateur. Je veux changer une partie du texte, mais j'ai du mal à trouver un matcher et un remplaçant. En utilisant l'exemple suivant:
###############################################################################
# Trackpad, mouse, keyboard, Bluetooth accessories, and input #
###############################################################################
# Trackpad: enable tap to click for this user and for the login screen
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
Je voudrais remplacer # Trackpad: ...
parrunning "Trackpad: ..."
En décomposant le problème, j'ai trouvé quelque chose en utilisant un testeur d'expressions régulières:
/\n\n#\s(.*)/g
Si j'essaie de l'utiliser dans Vim, cela ne fonctionne pas pour moi:
:/\n\n#\s(.*)/running "\1"/g
Je suppose que mon problème se résume à deux questions spécifiques:
- Comment puis-je éviter de rechercher des
\n
caractères et m'assurer à la place de#
ne pas apparaître à la fin du groupe de recherche? - Comment puis-je utiliser efficacement les groupes de capture?
Il y a quelques bonnes réponses ci-dessous. Difficile de choisir entre les trois, mais je pense que la réponse choisie est la plus précise pour ma spécification d'origine. Je vous recommande d'essayer les trois réponses avec le fichier réel pour voir ce que vous en pensez.
la source
:%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/
(ajouté le drapeau "magique"). Il est vraiment difficile de choisir une réponse correcte pour ma question d'origine, mais je pense que cette réponse est la plus proche de ma réponse attendue d'origine. C'est aussi le seul qui fonctionne dans tout le fichier sans avoir besoin de sélectionner une plage.\r
au lieu de^M
pour obtenir de nouvelles lignes?J'utiliserais quelque chose comme:
^#
pour correspondre au#
caractère ancré au début de la ligne (cela répond à la question 1)\s\+
pour correspondre à un ou plusieurs espaces blancs\(
pour démarrer un groupe (cela répond à la question 2).\{-}\
pour faire correspondre n'importe quel caractère 0 fois ou plus d'une manière non gourmande ; cela diffère du.*
fait qu'il essaie de correspondre le moins possible et pas autant que possible. Essayez d'ajouter un:
caractère dans le commentaire pour voir pourquoi cela est important\)
pour terminer le sous-groupe.:
correspond à un littéral:
Nous remplaçons ensuite cela par le texte que vous voulez et utilisons
\1
pour faire référence au groupe que nous avons capturé.La syntaxe des expressions régulières est un peu comme la syntaxe wiki: il y en a beaucoup, elles se ressemblent toutes en un coup d'œil, aucune n'est évidemment meilleure qu'une autre, mais il y a beaucoup de différences.
Aujourd'hui, les expressions régulières dites "compatibles Perl" sont par défaut de facto dans la plupart des langues, mais les expressions régulières Vim ne sont pas compatibles avec les expressions compatibles Perl! La syntaxe d'expression rationnelle de Vim remonte au moins aux années 70, quand Perl n'était même pas là.
Vous pouvez le voir avec les sous-groupes, où vous devez utiliser
\(
et non(
(cela est compatible avec la syntaxe POSIX "de base", mais pas avec la syntaxe POSIX "étendue" plus courante ou la syntaxe Perl). Vous pouvez contrôler cela en ajoutant le\v
drapeau dans un modèle (voir:help /\v
pour plus de détails), cela le rendra "plus compatible", mais pas complètement (vous devez toujours l'utiliser.{-}
pour des correspondances non gourmandes par exemple)Cela pourrait donc expliquer pourquoi l'utilisation d'un "testeur d'expressions rationnelles" fonctionne presque, mais pas tout à fait,.
http://www.vimregex.com/ comme un bon aperçu / cheatsheet des regexps Vim.
la source
:
. Voir le fichier complet pour plus de détails github.com/squarefrog/dotfiles/blob/master/osx/…Vous pouvez:
#
::/[^#]$/
#\s(.*)
en début de ligne:s/\v^#\s(.*)/running "\1"/
Pour utiliser des groupes, vous devez soit:
\(.*\)
ou\v
:s/\v...
Le combiner:
la source