Minulla on tiedosto, jossa on joukko käyttäjän oletuksia. Haluan muuttaa osan tekstistä, mutta kamppailen keksin ottelijan ja korvaavan henkilön. Käyttämällä seuraavaa esimerkkiä:
############################################################################### # 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
Haluan korvata # Trackpad: ...
running "Trackpad: ..."
ongelman hajottamiseksi keksin jotain regex-testerin avulla:
/\n\n#\s(.*)/g
Jos yritän käyttää tätä Vimissä, se ei toimi minulle:
:/\n\n#\s(.*)/running "\1"/g
Luulen, että ongelmani kattaa kaksi erityistä kysymystä:
- Kuinka voin välttää
\n
-merkkien etsimisen ja sen sijaan varmistaa, että#
ei näy hakuryhmän lopussa? - Kuinka voin tehokkaasti käyttää sieppausryhmiä?
Alla on hyviä vastauksia. Vaikea valita kaikkien kolmen välillä, mutta mielestäni valittu vastaus on tarkin alkuperäiselle tekniselleni. Suosittelen, että kokeilet kaikkia kolmea vastausta todellisella tiedostolla , jotta näet, miltä sinusta tuntuu.
Vastaa
Vain selvyyden vuoksi … Luulen, että pyysit tämän olevan vaihtamisen tulos?
############################################################################### # Trackpad, mouse, keyboard, Bluetooth accessories, and input # ############################################################################### running "Trackpad: enable tap to click for this user and for the login screen" defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
Siinä tapauksessa suosittelen seuraavaa komentoa:
:%s/\n\n#\s\+\(.*\)/^M^Mrunning "\1"/
Kuvion selitys
:s/PATTERN/REPLACEMENT/
on komento korvaava . Prosentuaalinen merkki :%s
saa sen toimimaan koko tiedostossa eikä vain nykyisessä rivissä.
\n\n
sanoo, että kiinnostavan rivin on oltava tyhjän rivin jälkeen. Jos et välittänyt edellisestä tyhjästä rivistä, niin ^
riittää.
#\s\+
vastaa hashia merkki, jota seuraa yksi tai useampi välilyönti. \(.*\)
sieppaa kaikki seuraavat tekstit riville.
Selitys korvaavasta tekstistä
^M^M
lisää kaksi rivin päätä korvaamaan kuviossa olevat \n\n
. Muuten teksti siirretään rivin loppuun. ennen tyhjää riviä. Kirjoita kukin ^M
painamalla Ctrl-V Ctrl-M .
Lisää sitten merkkijono running
ja sen jälkeen mitä sulkuihin on kaapattu kaksoislainauksissa.
Kommentit
Vastaa
Käytän jotain tällaista:
:s/^#\s\+\(.\{-}\):/running "\1":/
-
^#
vastaamaan ankkuroitua merkkiä#
rivin alussa (tämä vastaa kysymykseen 1) -
\s\+
vastaamaan mitä tahansa tyhjää tilaa vähintään kerran -
\(
ryhmän perustamiseksi (tämä vastaa kysymykseen 2) -
.\{-}\
vastaamaan mitä tahansa merkkiä vähintään 0 kertaa ryhmässä ei ahne tapa ; tämä eroaa kohdasta.*
siinä, että se pyrkii vastaamaan mahdollisimman vähän eikä niin paljon kuin mahdollista. Yritä lisätä kommenttiin:
-merkki nähdäksesi miksi sillä on merkitystä -
\)
lopettaa alaryhmä. -
:
vastaa kirjaimellista:
Korvataan tämä sitten tekstillä haluat, ja käytä \1
-näppäintä viitataksesi kaapattuun ryhmään.
Keksin jotain käyttämällä regex-testaaja
Säännöllisen lausekkeen syntaksia muistuttaa vähän wiki-syntaksia: niitä on joukko, ne kaikki näyttävät samanlaisilta yhdellä silmäyksellä, kukaan niistä on tietysti parempi kuin mikään muu, mutta eroja on monia.
Nykyään niin sanotut ”Perl-yhteensopivat” säännölliset lausekkeet ovat tosiasiallisesti oletusarvoisia useimmilla kielillä, mutta Vim-säännölliset lausekkeet eivät ole yhteensopiva Perl-yhteensopivien lausekkeiden kanssa! Vim regexp -syntaksi palaa ainakin ”70”: een, kun Perl ei ollut edes ympärillä.
Voit nähdä tämän alaryhmissä, joissa sinun on käytettävä \(
eikä (
(tämä on yhteensopiva POSIX ”basic” -syntaksin kanssa, mutta ei yleisemmän POSIX ”laajennetun” tai Perl-syntaksin kanssa).Voit hallita tätä lisäämällä \v
-lipun kuvioon (katso :help /\v
lisätietoja), tämä tekee siitä ”yhteensopivamman”, mutta ei kokonaan (Sinun on silti käytettävä .{-}
esimerkiksi ahneille otteluille)
Joten tämä saattaa selittää, miksi ”regex-testerin” käyttö melkein, mutta ei aivan, toimii.
http://www.vimregex.com/ hyvänä yleiskatsauksena / huijaussivuksi Vim regexpsistä.
Kommentit
- Hyvä vastaus, etenkin miksi regex! = regex. Mitä tulee hakuun ja korvaamiseen, se ’ on hieman hankala, koska kommentissa voi olla tai ei ole
:
. Katso lisätietoja koko tiedostosta github.com/squarefrog/dotfiles/blob/master/osx/…
Vastaa
Voit:
- etsiä rivejä, jotka eivät pääty
#
::/[^#]$/
- korvaa
#\s(.*)
alussa rivi:s/\v^#\s(.*)/running "\1"/
Ryhmien käyttämiseksi sinun on joko:
- poistettava suluista niin, että niistä tulee osa regex-syntaksia:
\(.*\)
tai - käytä ”taikuutta” aloitetaan lauseke
\v
:s/\v...
Yhdistämällä se:
:/[^#]$/s/\v^#\s(.*)/running "\1"/
Kommentit
- Tämä toimii loistavasti, kiitos, että lisäsit selityksen tagien merkityksestä sen sijaan, että tarvitsisin vain tekstin kirjoita.
- Kiitos, että teit selväksi, että suluissa on t o pakenemaan, jotta siitä tulisi osa regex-syntaksia. Minulla oli aina ongelma regex-ryhmien kanssa saada heidät toimimaan.
:%s/\v\n\n#\s+(.*)/^M^Mrunning "\1"/
(lisäsi ” taikuuden ” lippu). On todella vaikea valita oikea vastaus alkuperäiseen kysymykseeni, mutta mielestäni tämä vastaus on lähinnä alkuperäistä odotettua vastausta. Se on myös ainoa, joka toimii koko tiedostossa tarvitsematta valita aluetta.\r
saadaksesi uusia rivejä?