Você pode usar:
:v/module/s/\v.*(sup|gnd).*//
-
:v/pattern/cmd
runscmd
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
runscmd
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 contermodule
.
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êmmodule
. - para as linhas que não o fazem, continuamos com os próximos dois comandos que excluem a linha se ela contiver
sup
ougnd
, 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 contenhasup
ougnd
(e o delimitador de linha) ) e executagawk
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 (porxargs -0
) e pula para o próximo arquivo. -
xargs -r0
processa quegawk
produz para executarsed
com esses caminhos de arquivo como argumentos. -
sed
edita o arquivo no lugar.