Puteți ajuta cu această regex în sourceslist.nanorc?

Regex:

 cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/  

Eroare:

 Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end  

Vă mulțumim.

Comentarii

  • Poate ar trebui să scapi de liniuță (-): aceasta poate fi interpretată ca un interval …

Răspuns

Problema este probabil plasarea semnului - în lista de caractere.

Ați folosit deja faptul că intervalele de caractere pot fi exprimate prin [start-end], ca în [a-z] fiind prescurtat pentru [abcdefghijkl...xyz] (deși vezi avertismentul de mai jos). Asta înseamnă că - este un caracter special și, dacă apare între două " obișnuite " caractere, este interpretat ca indicând încă un alt interval care cuprinde aceste două caractere și fiecare dintre ele.

Desigur, acest lucru funcționează numai dacă caracterul de după - este lexicografic " mai târziu " în ordinea de sortare, apoi caracterul care o precedă, care este și motivul mesajului dvs. de eroare (dvs. va vedea că dispare dacă spuneți (-_, deși asta nu vă va rezolva problema ).

Din moment ce doriți în mod evident pentru a se potrivi cu literalul - și în funcție de modul în care sunt interpretate expresiile regulate în .nanorc , fie

  • trebuie să-l scape (adică \-) sau
  • să-l plasezi primul sau ultimul în caracter listă (adică [-etc] sau [etc-]) care ar fi standard în expresiile regulate POSIX și GNU și, prin urmare, cea mai probabilă soluție pe un sistem Linux .

Vezi de ex. aici pentru referințe suplimentare.

Avertisment : Afirmația de mai sus " [a-z] fiind prescurtată pentru [abcdefghijkl...xyz] este nu este necondiționat adevărat ! Modul în care este interpretat intervalul depinde de setările locale, în special de ordinea de colaționare.

  • În " C " locale, ordinea este conform valorii codului ASCII, adică ABC...XYZ...abc...xyz. Aici, [a-z] înseamnă de fapt " toate caracterele mici ".
  • În majoritatea celorlalte limbi, majusculele și minusculele sunt grupate împreună, adică ordinea este aAbBcC...xXyYzZ. Aici, [a-z] ar însemna " toate caracterele mici și toate caracterele majuscule, cu excepția Z.
  • Tratamentul caracterelor non-ASCII, cum ar fi " umlaut ", este încă o altă problemă.

Consultați aici și aici pentru discuții suplimentare pe această temă.

Răspuns

Lipirea acestuia la https://regexr.com/ ajută la depanare mai bine.

Nu ați scăpat de - în interval, ca - este folosit pentru a specifica intervalul.

Vechi:

cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/ 

Corecție:

cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/ 

Comentarii

  • Vă mulțumim pentru link
  • Scăparea unei liniuțe într-o expresie între paranteze nu ar ajuta. Rețineți că barele înapoi nu au o semnificație specială pentru expresia din [...]. Aceasta înseamnă, de asemenea, că [\.] se potrivește cu un punct sau o bară inversă.
  • Chiar? Mă îndoiesc. Pentru a potrivi slash înainte, trebuie să o scăpați de două ori \\ pentru a o potrivi
  • @JamesJohn Încercați de ex. grep '[\]' <<<'\' sau grep -o '[\.]' <<<'123\.abc'
  • Inserați problema în grep și vedeți eroarea, apoi aplicați remedierea pentru a o remedia

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *