Chci vědět, které soubory mají řetězec $Id$.

grep \$Id\$ my_dir/mylist_of_files 

vrací 0 výskytů.

Zjistil jsem, že musím použít

grep \$Id$ my_dir/mylist_of_files

Pak vidím, že $Id je na výstupu barevný, tj. byl přiřazen.

Jak mohu porovnat druhý $ a proč nefunguje „t \$Id\$.

Nezáleží na tom, jestli druhý $ je poslední znak nebo ne.

Používám grep 2.9.


Před po zveřejnění své otázky jsem použil google …

našel jsem odpověď

Chcete-li vyhledat $ (znak dolaru) v souboru s názvem test2, zadejte:

grep \\ $ test2

Znaky \\ (dvojité zpětné lomítko) jsou nezbytné k tomu, aby vynutil, aby shell předal \ $ (jedno zpětné lomítko, znak dolaru) na příkaz grep. Znak \ (jedno zpětné lomítko) říká příkazu grep, aby s následujícím znakem (v tomto příkladu $) zacházel jako s doslovným znakem, nikoli se znakem výrazu. Pomocí příkazu fgrep se vyhnete nutnosti používat únikové znaky, jako je zpětné lomítko.

, ale nerozumím, proč grep \$Id funguje a proč grep \\$Id\\$ to nedělá.

Jsem trochu zmatená …

Odpověď

Zde jsou 2 samostatná čísla.

  1. grep používá základní regulární výrazy (BRE) a $ je speciální znak v BRE „s pouze na konci výrazu. Důsledkem toho je, že 2 instance $ v $Id$ nejsou stejné. první je normální znak a druhá je kotva, která odpovídá konci řádku. Aby druhá $ odpovídala doslovnému $ budete muset zpětnému lomítku uniknout, tj. $Id\$. Útěk z prvního $ také funguje: \$Id\$, a já to dávám přednost, protože to vypadá konzistentněji.¹

  2. Zde fungují dva zcela nesouvisející mechanismy úniku / citování: citace prostředí a citace zpětného lomítka regex. Problém je v tom, že mnoho znaků, které používají regulární výrazy, je pro shell také speciální, a navíc znak úniku regexu, zpětné lomítko, je také znakem uvozujícím prostředí. To je důvod, proč často vidíte nepořádky zahrnující dvojitá zpětná lomítka, ale nedoporučuji používat zpětná lomítka pro shell citující regulární výrazy, protože to není příliš čitelné.

    Místo toho nejjednodušší způsob, jak to udělat, je nejprve dát svůj celý regulární výraz v jednoduchých uvozovkách jako v "regex". Jednoduchá citace je nejsilnější formou citace, kterou shell má, takže pokud váš regex neobsahuje jednoduché uvozovky, nemusíte se již starat o citování prostředí a můžete se soustředit na čistou BRE syntaxi.

Pokud to tedy použijeme na původní příklad, nechme „s hodit správný regulární výraz (\$Id\$) do jednoduchých uvozovek. Následující by mělo dělat, co chcete:

grep "\$Id\$" my_dir/my_file 

Důvod, proč \$Id\$ nefunguje, je ten, že po odstranění nabídky shellu (správnější způsob, jak říct shell citace), regex, který grep vidí, je $Id$. Jak je vysvětleno v (1.), tento regex odpovídá doslovnému $Id pouze na konci řádku, protože první $ je doslovný, zatímco druhý je speciální kotevní znak.

¹ Pamatujte také, že pokud někdy přepnete na rozšířené regulární výrazy (ERE), např. pokud jste se rozhodli použít egrep (nebo grep -E), znak $ je vždy speciální. V ERE „s $Id$ by se nikdy nic neshodovalo, protože nemůžete mít znaky po konci řádku, takže \$Id\$ by byl jediný způsob, jak jít.

Komentáře

  • Aby se zabránilo tomu, že grep interpretuje svůj první parametr jako regulární výraz , můžete také udělat grep -F '$Id$'.
  • V mém prostředí (bash 4.3.42) grep '$Id\$' ... a grep \$Id\\$ ... práce
  • A pokud se jedná o příkaz v souboru makefile, musíte také uniknout $ s předchozím $: grep '$$Id\$$'. stackoverflow.com / a / 2382810/2097284

Odpověď

Chcete-li hledat $Id$ v souboru: můžete použít: grep "\$id*" filename

Komentáře

  • To bude odpovídat všemu počínaje $id, takže například $idea, nejen $id$ .

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *