Como apagar linhas específicas dentro de uma determinada área?

0

Desejo excluir algumas linhas específicas no assunto principal do YAML:

---
Author: aaaa
Title: bbbb
Time: cccc
Place: dddd
...

Digamos que eu queira excluir apenas as linhas do assunto que continham "title:" e "place:"

Para garantir que não estou excluindo nenhuma outra linha que contenha essas palavras, ele deve pesquisar apenas o assunto principal. Além disso, qualquer solução preferencialmente não usaria o número de linha, mas sim a palavra real como seu critério de seleção.

Qualquer ajuda seria muito apreciada, obrigado.

Minha própria pesquisa consiste em:

This - que exclui várias palavras de uma só vez

e este - que seleciona uma área específica do arquivo

    
por st john smith 20.03.2015 / 22:23

2 respostas

2

Não familiarizado com o YFM ( YAML front matter ), mas conforme esta página , ele deve ser o primeira coisa no arquivo e deve assumir a forma de YAML válido definido entre linhas tracejadas triplas . Isso significa que seu arquivo sempre começará com --- se YFM estiver presente, então você pode executar:

sed -n '1{/^---$/!q};1,/^---$/{/^Title: \|^Place: /d};p' infile

i.e. se a primeira linha não corresponder a --- q uit, caso contrário, d elete todas as linhas correspondentes a esses padrões, se ocorrerem entre a linha 1 st e a próxima linha correspondente a ---
Se o segundo marcador for ... , apenas altere a segunda expressão sed , mas observe que, para corresponder a um ponto literal, você terá que escapar, por exemplo. para corresponder ... você usaria \.\.\. ou \.\{3\} ):

sed -n '1{/^---$/!q};1,/^\.\.\.$/{/^Title: \|^Place: /d};p' infile
    
por 30.03.2015 / 23:09
0

Além da solução sed de heemayl, também uma opção grep:

grep -Ev '^Title:|^Place:' file.txt

Explicação:

  • grep -v para ignorar linhas que incluem Title: ou Place:
  • grep -E para empilhar os dois termos
  • ^ indica que os padrões devem estar no início da linha
por 21.03.2015 / 19:19

Tags