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 …
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.
-
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.¹ -
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
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$
.
grep -F '$Id$'
.grep '$Id\$' ...
agrep \$Id\\$ ...
práce$
s předchozím$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284