Como você combina uma linha que começa com um caractere especial usando grep?

0

Eu tenho muitos arquivos .txt no meu diretório que contêm as linhas que começam com '='

Por ex: a.txt tem a seguinte linha (com espaços inicialmente)

        =putSomething here;

Como escrevo uma consulta grep que coincida com a linha acima? Eu tentei o seguinte,

find . -name "*.txt" | xargs grep -rn "^[=].*$"
    
por user1449951 22.08.2017 / 02:29

4 respostas

2

Vamos pegar este arquivo de amostra:

$ cat file.txt
        =putSomething here;

Agora, para encontrar todos os arquivos .txt no diretório atual:

$ grep -n '^[[:space:]]*=' *.txt
file.txt:1:        =putSomething here;

Se você quiser encontrar todos os arquivos .txt no diretório atual e todos os seus subdiretórios , use:

$ grep -rn '^[[:space:]]*=' --include '*.txt'
subdir/another.txt:1:        =putSomething here;
file.txt:1:        =putSomething here;

Notas

  1. find e xargs não são necessários aqui. Com a opção -r , grep pesquisa de forma recursiva por meio de subdiretórios.

  2. --include '*.txt' limits grep para arquivos correspondentes ao glob *.txt .

  3. ^ corresponde no início de uma linha. [[:space:]]* corresponde a zero ou mais caracteres em branco. = corresponde a um sinal de igual. Em expressões regulares POSIX, não há nada de especial sobre = , de modo que possa ser tratado como qualquer outro caractere.

  4. Terminar um regex do grep com .*$ não altera quais linhas são correspondidas. .*$ corresponde a qualquer caractere ou se nenhum caractere for seguido. O único motivo para usar .*$ é alterar o que o grep destaca como texto correspondente.

por 22.08.2017 / 03:02
2

Uma linha que começa com = traduz o regex ^= .

Seu comando de localização deve ser:

find . -name "*.txt" | xargs grep '^='

Ou melhor (evite o uso inútil de xargs ):

find . -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} +

(aqui, devido ao final + , apenas um grep é executado para um monte de arquivos)

    
por 22.08.2017 / 02:37
0

Tentei o comando abaixo e parece funcionar.

grep -rn '^ *=' **/*txt
    
por 22.08.2017 / 04:06
0

Como uma alternativa para a% recursivagrep e xargs :

$ find /dir -type f -name "*.txt" -exec grep -q '^[[:space:]]*=' {} ';' -print

Isso procurará em /dir (e abaixo) todos os arquivos regulares cujos nomes correspondam ao padrão fornecido. Para cada arquivo, se grep -q '^[[:space:]]*=' sair com um status de saída zero (o padrão foi correspondido em algum lugar no arquivo), seu nome será gerado.

Ou, se você quiser apenas ver as linhas em si:

$ find /dir -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} '+'

O + no final alimentará tantos nomes de arquivos quanto possível para cada invocação para grep , enquanto usar ; como no meu primeiro exemplo alimentaria apenas um arquivo de cada vez.

    
por 22.08.2017 / 06:53