Como excluir uma linha que contém uma sintaxe específica, mas eu quero evitar uma linha que contenha outra palavra

4

Como posso remover uma linha com uma palavra específica, mas tendo em mente: se outra palavra for encontrada, não exclua a linha. Por exemplo, estou excluindo uma linha com sup ou gnd com :%s/.*sup.*//g ou :%s/.*gnd.*//g , mas também está excluindo algumas linhas que estão quebrando a linha de loop também.

Eu não quero excluir linhas que tenham module na mesma linha que gnd ou sup . Alguma ideia de como conquistar a linha?

    
por CLEX420 01.05.2018 / 08:26

2 respostas

5

Você pode usar:

:v/module/s/\v.*(sup|gnd).*//
  • :v/pattern/cmd runs cmd nas linhas que não correspondem ao padrão
  • \v ativa muito mágica para que todos os caracteres ( , | sejam tratados como operadores regexp sem a necessidade de prefixá-los com \ .

Observe que esvazia , mas de outra forma não remove as linhas que contêm sup ou gnd . Para removê-los, como você não pode aninhar os comandos g / v , você pode usar o operador regexp de look_eg negativo do vim em um comando g :

:g/\v^(.*module)@!.*(sup|gnd)/d
  • :g/pattern/cmd runs cmd nas linhas que o do corresponde ao padrão
  • (pattern)@! (com muito mágica ) combina com largura zero se o padrão não for correspondido nessa posição, então ^(.*module)@! corresponde no começo de uma linha que não 't conter module .

Há também a opção de canalizar para sed ou awk :

:%!sed -e /module/b -e /sup/d -e /gnd/d
  • /module/b ramifica (e a linha é impressa) para linhas que contêm module .
  • para as linhas que não o fazem, continuamos com os próximos dois comandos que excluem a linha se ela contiver sup ou gnd , respectivamente.

ou:

:%!awk '/sup|gnd/ && ! /module/'

Se você quiser encontrar os arquivos que precisam dessas linhas removidas e removê-los, provavelmente vai querer ignorar vim e fazer tudo com utilitários de processamento de texto. Em um sistema GNU:

find . ! -name '*.back' -type f -size +3c -exec gawk '
  /sup|gnd/ && ! /module/ {printf "%s
:v/module/s/\v.*(sup|gnd).*//
", FILENAME; nextfile}' '{}' + | xargs -r0 sed -i.back -e /module/b -e /sup/d -e /gnd/d

(aqui salvando um backup dos arquivos originais como the-file.back , altere -i.back para -i se você não precisar do backup).

  • find encontra os arquivos regulares cujo nome não termina em .back e cujo tamanho é de pelo menos 4 bytes (os menores não podem conter uma linha que contenha sup ou gnd (e o delimitador de linha) ) e executa gawk com os caminhos dos arquivos correspondentes como argumentos.
  • quando gawk encontra uma linha em qualquer um desses arquivos correspondentes, ela imprime o caminho do arquivo ( FILENAME special variable) delimitado com um caractere NUL (por xargs -0 ) e pula para o próximo arquivo.
  • xargs -r0 processa que gawk produz para executar sed com esses caminhos de arquivo como argumentos.
  • sed edita o arquivo no lugar.
por 01.05.2018 / 08:44
0

Encontrou como : v / (módulo \ | entrada \ | saída) / s / \ v. . /

    
por 02.05.2018 / 08:11

Tags