Lista os nomes dos arquivos que contêm uma string que ocorre entre duas outras strings

3

Eu preciso imprimir uma lista de arquivos que correspondam a um padrão específico - uma string que ocorre entre duas outras strings. Como faço isso. Eu não quero extrair texto, apenas listar os arquivos que correspondem a esse padrão.

Eu preciso de um comando que corresponda e liste todos os nomes de arquivos que contenham uma instância da string PREFETCH , que ocorre em algum lugar entre essas duas strings: advanced_override.begin e advanced_override.end . Os arquivos estão todos presentes no mesmo diretório, portanto, o comando deve pesquisar o conteúdo do diretório atual '.' e liste os nomes de arquivos que correspondem ao padrão especificado.

ATUALIZAÇÃO:

Deve ter algo parecido com isto: advanced_override.begin <lots of text> PREFTECH <lots of other text> advanced_override.end . Eu preciso que ele corresponda a essa string em algum lugar entre essas duas strings e pode haver muitos outros textos antes ou depois de PREFETCH .

ATUALIZAÇÃO DOIS:

Os arquivos de entrada são arquivos XML. E a seção que começa com advanced_override.begin e advanced_override.end pode ser grande com muitas linhas de texto.

    
por Selena 06.06.2016 / 18:28

2 respostas

0

Você pode usar pcregrep , se disponível, com a opção -l , para listar apenas os nomes dos arquivos correspondentes:

pcregrep -lM '(?s)advanced_override\.begin.*PREFETCH.*advanced_override\.end' ./*

Isso pesquisa no modo de múltiplas linhas para essas duas seqüências com PREFETCH entre elas. Ele supõe que haja apenas arquivos de texto no diretório atual (se esse não for o caso, você pode usar um for loop ou find ) e também que cada arquivo contém uma única seção que começa com advanced_override.begin e termina com advanced_override.end - com várias seções, pode ser melhor usar uma visão antecipada negativa antes de PREFETCH , por exemplo:

pcregrep -lM '(?s)advanced_override\.begin(?:(?!advanced_override\.end).)*PREFETCH.*advanced_override\.end' ./*
    
por 06.06.2016 / 20:13
0

Os avisos acima, aqui e aqui , mas especialmente aqui sobre a tentativa de analisar arquivos XML com expressões são bem atendidas. Em geral, o texto XML pode não estar confinado a uma única linha, mas como neste caso você está procurando por palavras únicas específicas e assumindo que elas não estão separadas por várias linhas, você pode usar um simples script awk que mantém "estado". Se ele vir a próxima palavra esperada, ele incrementará o valor state . Se ele encontrar todos os padrões esperados na ordem correta, ele definirá uma variável found na qual baseamos um código de retorno:

#!/bin/sh
for f in *
do
  awk '
/advanced_override\.begin/ { state=1; }
/PREFETCH/ && state == 1 { state=2; }
/advanced_override\.end/ && state == 2 { found=1; }
END {
  if (found)
    exit 0
  else
    exit 1
}
' "$f" && printf "Found in: %s\n" "$f"
done

Dados estes 3 exemplos de arquivos de entrada:

$ cat input1
junk
advanced_override.begin other text
other text
PREFETCH other text
other text
advanced_override.end

$ cat input2
just some stuff
advanced_override.end

$ cat input3
junk
advanced_override.begin other text other text PREFETCH other text other text advanced_override.end
junk

Uma amostra de execução do script produz:

Found in: input1
Found in: input3
    
por 13.04.2018 / 18:24