Etsi ja korvaa säännöllisten lausekkeiden avulla

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ä:

  1. Kuinka voin välttää \n -merkkien etsimisen ja sen sijaan varmistaa, että # ei näy hakuryhmän lopussa?
  2. 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

  • En voi muokata vastaustasi, mutta mielestäni tarkoitit :%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.
  • IIRC voit käyttää \r saadaksesi uusia rivejä?

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

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *