it-swarm-eu.dev

grep a unikající znak dolaru

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

grep \$Id\$  my_dir/mylist_of_files

vrátí 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 zbarven, tzn. Že byla přiřazena.

Jak bych mohl porovnat druhý $ A proč nefunguje \$Id\$.

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

Používám grep 2.9.


Před zveřejněním mé otázky jsem použil google ...

Našel jsem odpověď

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

grep \\ $ test2

Znaky \\ (dvojité zpětné lomítko) jsou nezbytné k tomu, aby donutily Shell, aby předal příkaz grep\$ (jedno zpětné lomítko, znak dolaru). Znak\(jednoduché zpětné lomítko) říká příkazu grep, aby s následujícím znakem (v tomto příkladu $) zacházel spíše jako se znakem doslovným než se znakem výrazu. Pomocí příkazu fgrep se vyhněte nutnosti použití únikových znaků, jako je zpětné lomítko.

ale nechápu, proč grep \$Id funguje a proč grep \\$Id\\$ ne.

Jsem trochu zmatená ...

33
Luc M

Jsou zde 2 samostatné problémy.

  1. grep používá Základní regulární výrazy (BRE) a $ je speciální znak v BRE pouze na konci výrazu. Důsledkem toho je, že 2 příklady $ v $Id$ nejsou si rovni. První je normální znak a druhý je kotva, která odpovídá konci řádku. Chcete-li udělat druhý $ odpovídá literálu $ budete muset zpětné lomítko uniknout, tj. $Id\$. Útěk z prvního $ také funguje: \$Id\$, a já tomu dávám přednost, protože to vypadá konzistentněji.¹

  2. V práci jsou dva zcela nesouvisející mechanismy úniku/citace: Citace shellu a regulární zpětné lomítko. Problém je v tom, že mnoho znaků, které používají regulární výrazy, jsou také speciální pro prostředí Shell, a kromě toho je znak úniku regexu zpětné lomítko také znakem pro citaci prostředí Shell. 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 citace regulárních výrazů, protože to není příliš čitelné.

    Místo toho je nejjednodušším způsobem, jak to udělat, nejprve vložit celý regex do jednoduchých uvozovek jako v 'regex'. Jediný citát je nejsilnější formou citace, kterou Shell má, takže pokud váš regex neobsahuje jednoduché uvozovky, nemusíte se již starat o citaci Shell a můžete se soustředit na čistou syntaxi BRE.

Pokud tedy použijete tento zpět na svůj původní příklad, hodíme správný regex (\$Id\$) uvnitř jednoduchých nabídek. Následující kroky by měly dělat, co chcete:

grep '\$Id\$' my_dir/my_file

Důvod \$Id\$ nefunguje, protože po odstranění nabídky Shell (správnější způsob, jak říci citace Shell), je regex, který grep vidí, $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í znak ukotvení.

¹ Nezapomeňte 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 zvláštní. V ERE's $Id$ by nikdy nic neodpovídalo, protože nemůžete mít znaky po konec řádku, takže \$Id\$ by byl jediný způsob, jak jít.

26
jw013