O que realmente significa string nula?

2

Tenho certeza que a maioria de nós sabe que, quando queremos que algumas regex coincidam com uma string no início da linha, devemos usar "^" ...

Mas estou tentando entender o que realmente significa "string vazia no começo da linha"

Eu sei que eco "Hello World" | grep ^ H corresponde a

Então, dê uma olhada na saída desses comandos:

[sergio@localhost ~]$ dd if=/dev/zero of=/tmp/texto  count=1 bs=1 2>/dev/null
[sergio@localhost ~]$ od -ta /tmp/texto          
0000000 nul
0000001

Até agora tudo como esperado, então:

[sergio@localhost ~]$ echo  "Hello" >> /tmp/texto
[sergio@localhost ~]$ grep -a "^Hello" /tmp/texto 

Bem, a primeira coisa que devo confessar não esperava, antes de Hello, há um caractere nulo, então por que não é compatível?

OK, vamos usar o grep no estilo perl:

[sergio@localhost ~]$ grep -a -P "\x00Hello" /tmp/texto 
Hello

OK, corresponde a

Mas o que eu não entendo (por acaso eu tenho algum conceito errado) porque o grep -a "^ Hello" não combina ...

Você poderia me ajudar?

obrigado antecipadamente!

    
por sebelk 04.09.2013 / 14:38

3 respostas

5

Você está confundindo o caractere nulo (valor binário 0) com a string vazia .

A "string vazia no começo da linha" é simplesmente o não conteúdo (que existe) antes do primeiro caractere da linha. A string vazia no final da linha, similarmente, é o não-conteúdo similar encontrado após o último caractere da linha. Uma string vazia pode ser considerada como "string vazia, string vazia", enquanto uma string com algum conteúdo pode ser considerada como "string vazia, Hello world, string vazia".

Uma string em C é representada como uma série de bytes não-0 seguidos por um ou mais 0 bytes que indicam terminação de string, mas isso é completamente separado de "string vazia" no parlace de expressão regular e realmente uma escolha interna na linguagem de programação C e na biblioteca padrão. Poucos outros idiomas fazem isso dessa maneira, mas mesmo assim podem representar strings vazias.

    
por 04.09.2013 / 14:50
2

Uma "string nula" não é o mesmo que um "caractere nulo". Uma string nula é a string vazia, "". O caractere nulo é um caractere com todos os bits definidos como 0. Ele pode ser representado entre aspas duplas como \ 0, portanto, o resultado do seu comando dd era "\ 0". O acréscimo então fez "\ oi". Esta não foi uma cadeia nula. O padrão "^ Hello" coincide apenas com as linhas que começam com "Hello", o que o seu não fez, porque começou com "\ 0", em vez de "H".

    
por 04.09.2013 / 14:52
0

Sequência imaginária de cinco caracteres, seguida por duas sequências diferentes:

^  _ _ _ _ _  $
^  H e l l o  $
^ 
^  _ _ _ _ _  $
^  H e l l o  $
^ %pre% H e l l  $
H e l l $
  • O cifrão e o circunflexo não correspondem a nenhum caractere, eles correspondem aos limites de uma string.
  • null (\ 0) é um caractere real e ocupa espaço apenas como abcd ...

Portanto, "^ H" não corresponderia a "\ 0abcd" (assim como "^ Z" não corresponderia a "abcd"), porque "\ 0abcd" começa com o caractere nulo e não com "H".

    
por 04.09.2013 / 18:04