Recuperando arquivos com o grep que contêm! #abc

2

Estou tentando exibir arquivos que contenham

!#abc

Eu tentei assim

grep -l '!#abc'

mas não funciona. Por quê?

Além disso, quando tento algo como

echo "#!a"

recupera

echo "#alias".

Alguém pode, por favor, me explicar o que está acontecendo aqui? O que #! de fato representa?

    
por Kate 16.11.2016 / 12:37

2 respostas

0

você tem que escrever

grep \!\#abc <file>

você basicamente tem que escapar tanto do # quanto do ! , esses dois caracteres têm um significado especial em praticamente qualquer shell, leia o manual do seu shell para saber mais sobre eles.

    
por 16.11.2016 / 12:49
0

Bem, o grep: grep -l '!#abc' também precisa de uma lista de arquivos para processar:

grep -l '!#abc' ./*

funciona em todos os arquivos no diretório atual.

O echo: echo "#!a" precisa de um pouco mais de citações, como:

$ echo '#!a'
#!a

$ echo '#'\!'a'
#!a

$ echo '#'\!a
#!a

$ echo "#!"a
#!a

$ echo "#"'!a'
#!a

$ echo $'#!a'
#!a

O '#' é o caractere de comentário. De LESS=+'/^ *COMMENTS' man bash :

COMMENTS

In a non-interactive shell, or an interactive shell in which the  
interactive_comments option to the shopt builtin is enabled (see SHELL  
BUILTIN COMMANDS below), a word beginning with # causes that word and  
all remaining characters on that line to be  ignored. An interactive  
shell without the interactive_comments option enabled does not allow  
comments. The interactive_comments option is on by default in  
interactive shells.

Tudo o que se segue em uma linha é considerado 'um comentário' e não é processado, como:

$ echo one # two three
one

Se você quiser evitar o efeito, é necessário citá-lo ou colocá-lo logo depois de outro caractere que não esteja em branco:

$ echo one t# wo three
one t# wo three

O ! é o histórico "caractere chave".
Apenas a ponta do iceberg: De LESS=+'/^ *HISTORY EXPANSION' man bash :

HISTORY EXPANSION
History expansions are introduced by the appearance of the history expansion character, which is ! by default. Only backslash () and single quotes can quote the history expansion character, but the history expansion character is also treated as quoted if it immediately precedes the closing double quote in a double-quoted string.

Então, para sua última pergunta: What does #! in fact represent? .

A resposta é It depends. Depende dos personagens próximos também. Depende se é citado (e como é citado) ou não. E depende se tiver espaço em branco precedente e / ou espaço em branco à direita.

Se corretamente citado, apenas os mesmos caracteres. Se não for citado com um espaço à esquerda: um comentário. Se não for citado, nenhum espaço inicial, nenhum espaço à direita: uma expansão de histórico.
Se não for citado, não há espaço à esquerda, com um espaço à direita: os caracteres.

Isso, claro, está assumindo que as opções

shopt -p interactive_comments
shopt -po history

São ambos definidos. Cada um controla o respectivo caractere ( # e ! ) em shells interativos. Em shells não interativos, o caractere de comentário é sempre imposto e a expansão do histórico quase sempre não é ativada.

    
por 17.11.2016 / 06:43

Tags