Como o “$” funciona no “apt-cache search something $”

3

Eu entendo que:

$ apt-cache search package_name

pesquisará correspondências em nomes e descrições.

Mas como isso funciona?

$ apt-cache search package_name$

Por exemplo,

$ apt-cache search desktop

produzirá uma lista de nomes e descrições curtas de pacotes que têm "área de trabalho" em qualquer lugar do nome ou da descrição.

Então, se eu entendi corretamente,

$ apt-cache search desktop$

deve produzir um subconjunto no qual "desktop" é a última palavra no nome ou em qualquer linha na descrição.

Mas eu encontrei um exemplo, xjig , que aparece com apt-cache search desktop , mas não aparece com apt-cache search desktop$ , embora a descrição de acordo com apt-cache show xjig tenha "área de trabalho" na segunda linha de a descrição:

Description-en: An X11 jigsaw puzzle
xjig is a puzzle that tries to replicate a jigsaw puzzle on the screen
as closely as possible. Any GIF, JPEG or PPM image may be loaded and cut
into pieces. The goal (as with any jigsaw puzzle) is to reassemble the
original picture.
.
Tiles may be freely rotated by use of the mouse, flipped (for
double-sided puzzles) and even shown as shaped windows on the desktop
(fast machine/video card recommended for the latter!). An example image
is provided in /usr/share/games/xjig .

Então, por que xjig não é incluído na saída de apt-cache search desktop$ ?

    
por GAD3R 28.01.2014 / 07:02

2 respostas

3

Na página apt-cache man:

search regex...
   search performs a full text search on all available package lists for the 
   POSIX regex pattern given, see regex(7). It searches the package names 
   and the descriptions for an occurrence of the regular expression and 
   prints out the package name and the short description, including virtual 
   package names. If --full is given then output identical to show is 
   produced for each matched package, and if --names-only is given then the 
   long description is not searched, only the package name is.

   Separate arguments can be used to specify multiple search patterns that 
   are and'ed together.

Observe que ele indica regex(7) . Então, quando você diz apt-cache para procurar por algo, você está fornecendo uma expressão regular. O $ em uma expressão regular significa que você deseja corresponder, ancorado ao final das strings.

Então, se tivermos o valor desktop$ , corresponderemos somente as strings em que desktop estava no final das sequências, como:

  • esta é uma área de trabalho
  • esta é uma string muito longa com área de trabalho

Mas não corresponderia a strings como:

  • esta é a área de trabalho na janela
  • esta é outra área de trabalho na janela

No seu caso, a string desktop na descrição do xjig, embora no final de uma linha na descrição, não está no final do valor do campo de descrição.

Exemplo

Aqui está a descrição do xjig.

Description-en: An X11 jigsaw puzzle
 xjig is a puzzle that tries to replicate a jigsaw puzzle on the screen
 as closely as possible. Any GIF, JPEG or PPM image may be loaded and cut
 into pieces. The goal (as with any jigsaw puzzle) is to reassemble the
 original picture.
 .
 Tiles may be freely rotated by use of the mouse, flipped (for
 double-sided puzzles) and even shown as shaped windows on the desktop
 (fast machine/video card recommended for the latter!). An example image
 is provided in /usr/share/games/xjig .

Se eu pesquisar todas as strings que terminarem com xjig .$ .

$ apt-cache search 'xjig \.$'
xjig - An X11 jigsaw puzzle

Lembre-se de que o valor da descrição é apenas uma cadeia longa que é envolvida nesse ponto, portanto, embora "desktop" esteja no final de uma linha, ela não está no final do valor da descrição.

Alternativa

Tendo em vista que você está procurando a palavra desktop , você pode procurar a sequência com espaços de ambos os lados ( \s ) ou limites de palavras ( \b ).

$ apt-cache search '\sdesktop\s' | grep xjig
xjig - An X11 jigsaw puzzle

$ apt-cache search '\bdesktop\b' | grep xjig
xjig - An X11 jigsaw puzzle

Entendendo as âncoras regulares

Talvez usar grep para ver o que uma âncora faz em um regex ajudaria.

área de trabalho não no final

$ echo "this is a desktop string" | grep "desktop$"
$

área de trabalho no final

$ echo "this is a desktop" | grep "desktop$"
this is a desktop

O elogio a $ para a ancoragem de correspondências no final das sequências é o ^ para as correspondências de ancoragem ao início.

área de trabalho não no começo

$ echo "this is a desktop" | grep "^desktop"
$

área de trabalho no início

$ echo "desktop this is a desktop" | grep "^desktop"
desktop this is a desktop
    
por 28.01.2014 / 08:02
3

O campo description é um campo com várias linhas, mas $ no regexp significa o fim do campo, não o final de cada linha do campo. Então, se você quiser procurar por desktop no final de uma linha ou no final do campo, você precisa:

apt-cache search 'desktop(
|$)'

Ou com as cotas ksh93 $'...' (também encontradas em zsh e bash ), permitindo \x de sequências de escape:

apt-cache search $'desktop(\n|$)'

Observe também que . corresponde a um caractere de nova linha. Escrito em perl , isso seria:

print "$name - $summary" if 
   $name =~ qr{$re}si ||
   $description =~ qr{$re}si;

(exceto que eles não são regexps perl, claro)

    
por 28.01.2014 / 08:19