Como enterrar uma marca invisível em linhas de texto?

3

Como posso enterrar uma marca invisível em linhas aleatórias de texto? Essa marca tem que estar lá, embora seja invisível para alguém que esteja lendo o texto impresso no console.

Eu quero identificar essas linhas por meio de uma marca invisível para, por exemplo, inseri-las mais tarde ou mais tarde.

Eu tentei 0x00 sem sucesso. Eu esperava que grep imprimisse linhas correspondentes a 0x00 em algum lugar. Mas isso não funcionou:

$ echo -e "a
$ echo -e "a%pre%b" | hexdump -C
00000000  61 00 62 0a                                       |a.b.|
00000004
$ echo -e "a%pre%b" | grep "a%pre%b"
b" | hexdump -C 00000000 61 00 62 0a |a.b.| 00000004 $ echo -e "a%pre%b" | grep "a%pre%b"
    
por n.r. 29.12.2013 / 22:53

2 respostas

5

Não há uma maneira totalmente confiável de colocar uma marca invisível em um arquivo de texto. Um arquivo de texto não tem espaço para nada que não seja texto puro, afinal. Comentários (texto que não pertence ao texto principal) são uma forma de marcação.

Bytes nulos são uma má idéia não apenas porque podem ser renderizados como ^@ ou ou ou outras formas, mas também porque muitas ferramentas de processamento de texto sufocam nelas. Bytes nulos são um marcador de fim de string na linguagem de programação C e muitos programas o tratam como o fim de um trecho de texto (por exemplo, de uma linha, mas não necessariamente) porque eles são escritos em C ou usam bibliotecas escritas em C.

Se o seu texto estiver codificado em Unicode, você poderá usar um de seus vários caracteres de largura zero:

  • U + 200B ZERO WIDTH SPACE (espaço de quebra de largura zero)
  • U + 200C ZERO WIDTH NON-JOINER (um constituinte de palavra de largura zero que impede as ligaduras)
  • U + 200D ZERO WIDTH JOINER (um constituinte de palavra de largura zero que força as ligaduras)
  • U + 2060 WORD JOINER (um espaço sem quebra de largura zero)

Os espaços não são constituintes de palavras, os outros são. Embora nenhum desses caracteres seja renderizado visivelmente (assumindo um visualizador com suporte razoável a Unicode), isso tem um impacto ao selecionar texto, mover-se, pesquisar, etc. O espaço de quebra pode ser renderizado como uma quebra de linha.

    
por 30.12.2013 / 00:17
2

Você pode grep para null ou outros caracteres especiais usando o sinalizador -P e o código hexadecimal:

echo -e "a
$ echo -e "the matrix
echo -e "a
$ echo -e "the matrix%pre%%pre%%pre%%pre%\n\bh\ba\bs\b \by\bo\bu\b%pre%%pre%:-)"
the matrix
:-)

$ echo -e "the matrix%pre%%pre%%pre%%pre%\n\bh\ba\bs\b \by\bo\bu\b%pre%%pre%:-)"  | hexdump -C
00000000  74 68 65 20 6d 61 74 72  69 78 00 00 00 00 0a 08  |the matrix......|
00000010  68 08 61 08 73 08 20 08  79 08 6f 08 75 08 00 00  |h.a.s. .y.o.u...|
00000020  3a 2d 29 0a                                       |:-).|
00000024
b\nhello" | grep -a -P '\x0'
%pre%%pre%%pre%\n\bh\ba\bs\b \by\bo\bu\b%pre%%pre%:-)" the matrix :-) $ echo -e "the matrix%pre%%pre%%pre%%pre%\n\bh\ba\bs\b \by\bo\bu\b%pre%%pre%:-)" | hexdump -C 00000000 74 68 65 20 6d 61 74 72 69 78 00 00 00 00 0a 08 |the matrix......| 00000010 68 08 61 08 73 08 20 08 79 08 6f 08 75 08 00 00 |h.a.s. .y.o.u...| 00000020 3a 2d 29 0a |:-).| 00000024
b\nhello" | grep -a -P '\x0'

Você também pode ocultar o texto colocando caracteres de retrocesso após eles, por exemplo:

%pre%     
por 29.12.2013 / 23:00

Tags