Vreau să știu ce fișiere au șirul $Id$.

grep \$Id\$ my_dir/mylist_of_files 

returnează 0 apariții.

Am descoperit că trebuie să folosesc

grep \$Id$ my_dir/mylist_of_files

Apoi văd că $Id este colorată în ieșire, adică a fost potrivită.

Cum aș putea să potrivi al doilea $ și de ce nu funcționează „t \$Id\$.

Nu contează dacă al doilea $ este ultimul caracter sau nu.

Folosesc grep 2.9.


Înainte postând întrebarea mea, am folosit google …

Am găsit un răspuns

Pentru a căuta un semn $ (dolar) în fișierul numit test2, introduceți:

grep \\ $ test2

Caracterele \\ (backslash dublu) sunt necesare pentru a forța shell-ul să treacă un \ $ (backslash unic, semn de dolar) la comanda grep. Caracterul \ (backslash unic) spune comenzii grep să trateze următorul caracter (în acest exemplu $) ca un caracter literal, mai degrabă decât ca un caracter de expresie. Utilizați comanda fgrep pentru a evita necesitatea utilizării caracterelor de evadare, cum ar fi backslash.

dar nu înțeleg de ce grep \$Id funcționează și de ce grep \\$Id\\$ nu „t.

Eu sunt puțin confuz …

Răspunde

Există 2 probleme separate aici.

  1. grep folosește Expresii regulate de bază (BRE), iar $ este un caracter special în BRE „s numai la sfârșitul unei expresii. Consecința acestui fapt este că cele 2 instanțe ale $ din $Id$ nu sunt egale. primul este un caracter normal, iar al doilea este o ancoră care se potrivește cu sfârșitul liniei. Pentru a face ca al doilea $ să se potrivească cu un literal $ va trebui să scapi de backslash, adică $Id\$. Scăparea primului $ funcționează și: \$Id\$ și prefer acest lucru, deoarece pare mai consistent .¹

  2. Aici funcționează două mecanisme de scăpare / citare complet lipsite de legătură: citarea shell-ului și citarea inversă regex. Problema este că multe caractere pe care le folosesc expresiile obișnuite sunt speciale și pentru shell și, pe deasupra, caracterul regex escape, backslash, este, de asemenea, un caracter care citează shell. Acesta este motivul pentru care vedeți adesea încurcături care implică backslash-uri duble, dar nu vă recomand să folosiți backslash-uri pentru a cota expresii regulate, deoarece nu este foarte ușor de citit.

    În schimb, cel mai simplu mod de a face acest lucru este să puneți mai întâi întreg regex în ghilimele unice ca în "regex". Citatul unic este cea mai puternică formă de citare a shell-ului, astfel încât, atâta timp cât regex-ul dvs. nu conține ghilimele unice, nu mai trebuie să vă faceți griji cu privire la cotarea shell-ului și vă puteți concentra asupra sintaxei BRE pure.

Deci, aplicând acest lucru înapoi la exemplul dvs. original, să „aruncăm regexul corect (\$Id\$) în ghilimele simple. Următoarele ar trebui să facă ceea ce doriți:

grep "\$Id\$" my_dir/my_file 

Motivul pentru care \$Id\$ nu funcționează se datorează faptului că după eliminarea citatelor shell (modul mai corect de a spune shell citatul) este aplicat, regexul pe care îl vede grep este $Id$. După cum sa explicat în (1.), această regex se potrivește cu un literal $Id numai la sfârșitul unei linii, deoarece primul $ este literal, în timp ce al doilea este un caracter special de ancorare.

¹ Rețineți, de asemenea, că dacă treceți vreodată la Expresii regulate extinse (ERE), de exemplu, dacă ați decis să utilizați egrep (sau grep -E), caracterul $ este întotdeauna special. În ERE „s $Id$ nu s-ar potrivi niciodată cu nimic deoarece nu puteți avea caractere după sfârșitul unei linii, deci \$Id\$ ar fi singura cale de urmat.

Comentarii

  • Pentru a evita grep interpretarea primului său parametru ca expresie regulată , puteți face și grep -F '$Id$'.
  • În shell-ul meu (bash 4.3.42) grep '$Id\$' ... și grep \$Id\\$ ... work
  • Și dacă aceasta este o comandă într-un makefile, trebuie să scăpați și de $ cu un $: grep '$$Id\$$'. stackoverflow.com / a / 2382810/2097284

Răspuns

Pentru a căuta $Id$ într-un fișier: puteți utiliza: grep "\$id*" filename

Comentarii

  • Că se va potrivi cu orice începe cu $id, deci și $idea de exemplu, nu doar $id$ .

Lasă un răspuns

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