sed - se a condição for satisfeita, use o próximo padrão

1

Eu tenho vários arquivos de texto simples com estrutura semelhante, mas ligeiramente diferente, de onde preciso extrair uma linha em particular.

Esta linha de texto não segue nenhum padrão específico (ou seja, seu conteúdo é sempre diferente) e nem sempre está no mesmo lugar no arquivo - embora seja geralmente próximo ao início do arquivo.

Esses arquivos são comunicados de imprensa (originalmente em PDF, convertidos em texto com pdftotext ), e a linha que eu preciso extrair é o assunto, que eu preciso usar como nome de arquivo depois.

Se eu executar apenas sed -n '1p' nesses arquivos, extraindo a primeira linha, às vezes recebo o resultado desejado, com mais frequência não.

Uma amostra dos resultados diferentes que recebo:

Title of the press release  # correct result
                            # wrong, here the first line is empty
29.9.2016                   # wrong, here the first line contains the date
PRESS RELEASE               # also wrong, I would need to scan further down

Estes são praticamente todos os casos. O que me dá esperança é que, como esses arquivos têm uma estrutura muito semelhante e contêm um título próximo ao começo, se eu continuar digitalizando, mais cedo ou mais tarde, encontrarei o que estou procurando.

Existe alguma maneira de dizer ao sed, no mesmo comando sed , para experimentar diferentes padrões até que um conjunto de condições em não seja atendido?

No meu caso, eu precisaria dizer ao sed para:

  • verifique se a linha não está vazia
  • verifique se a linha não contém uma data
  • verifique se a linha não contém as palavras "Comunicado de imprensa"

Se nenhuma das condições for satisfeita, envie a linha, se alguma for atendida, pule para a próxima linha.

Isso é algo que sed seria capaz de fazer?

    
por zool 07.08.2018 / 14:47

1 resposta

2

Encontrar a primeira linha com qualquer forma de texto que não esteja vazia (e que não contenha apenas espaço em branco), não contenha apenas dígitos e pontos e não contenha a string PRESS RELEASE (capitalized):

sed '/^[[:blank:]]*$/d; /^[0-9.]*$/d; /PRESS RELEASE/d; q' file

Se as datas puderem ter - e espaços, e se PRESS RELEASE também puder ser escrito press release , Press Release ou Press release (ou pRESS Release ou alguma outra combinação):

sed -E '/^[[:blank:]]*$/d; /^[0-9. -]*$/d; /[Pp](RESS|ress) [Rr](ELEASE|elease)/d; q' file

ou com% GNUsed para correspondência insensível a maiúsculas e minúsculas de press release :

sed '/^[[:blank:]]*$/d; /^[0-9. -]*$/d; /press release/Id; q' file

Cada vez que um padrão é acionado, o comando d exclui essa linha da entrada e um novo ciclo é iniciado com a próxima linha. Se nenhum padrão for acionado, o q fará com que o script saia, mas a linha atual será impressa primeiro.

    
por 07.08.2018 / 15:00