Como posso excluir várias linhas no vi?

129

Eu tentei seguir o seguinte:

Como excluir o texto selecionado no editor VI

mas

5dd

E492: Não é um comando do editor: 5dd

Eu então tentei:

5d

O que exclui apenas uma única linha. Como posso excluir várias linhas?

deltanovember
fonte
2
Tanto quanto me lembro, 5dd deve ser uma sintaxe válida e deve excluir 5 linhas começando com a linha em que o cursor está. Alguma chance do CAPS LOCK estar ativado e você usa um layout de teclado que faz com que as teclas numéricas sejam alteradas quando estiver?
Eric J.

Respostas:

132

Parece que você está inserindo os comandos no modo de comando (também conhecido como "modo Ex"). Nesse contexto :5d, removeria a linha número 5, nada mais. Para 5ddfuncionar como pretendido - isto é, remova cinco linhas consequentes começando no cursor - digite-o no modo normal e não prefixe os comandos :.

nperson325681
fonte
142

Você pode excluir várias linhas (intervalo) se souber os números de linha:

:[start_line_no],[end_line_no]d

Nota: d significa exclusão

Onde,
start_line_no é a linha inicial que você não deseja excluir e end_line_no é a linha final que você não deseja excluir. As linhas entre o início e o fim, incluindo o início e o fim, serão excluídas.

Por exemplo:

:45,101d

As linhas entre 45 e 101, incluindo 45 e 101, serão excluídas.

Bonnie Varghese
fonte
14
Você também pode $indicar a última linha do arquivo. Então :45,$d, excluiria todas as linhas de 45 até o final.
freethebees
Você pode até usar padrões como/<\/div>/
Björn
1
Se você deseja iniciar o intervalo a partir do lne em que está atualmente, pode fazê-lo:.,[end_line_no]d
Joe
15

Comandos listados para uso no modo normal (prefixo com :para modo de comando).
Testado no Vim.

Por valor da linha:

  • numdd - excluirá as linhas numéricas DOWN da contagem inicial da posição atual do cursor (por exemplo 5dd, excluirá a linha atual e 4 linhas abaixo => exclui a linha atual e ( num-1 ) as linhas abaixo )
  • numdk - excluirá as linhas numéricas UP da linha atual e da própria linha atual (por exemplo 3dk, excluirá a linha atual e 3 linhas acima dela => exclui a linha atual e as linhas numéricas acima dela )

Por números de linha:

  • dnumG - excluirá as linhas da linha atual (inclusive) até o número da linha num (inclusive) (por exemplo, se o cursor estiver atualmente na linha 5 d2G, as linhas 2-5 serão incluídas)
  • dnumgg - excluirá as linhas da linha atual (inclusive) DOWN até o número da linha num (inclusive) (por exemplo, se o cursor estiver atualmente na linha 2 d6gg, as linhas 2-6 serão excluídas)
  • ( Modo de comando só ) :num1 ,num2d - excluirá linhas número da linha num1 (inclusive) até o número da linha num2 (inclusive) . Nota: se num1 for maior que num2 - o vim reagirá comBackwards range given, OK to swap (y/n)?

fonte
1
Isso me ajudou porque eu não sabia que o número 'd' 'd' estava tentando excluir o cursor abaixo. Eu estava com o cursor na parte inferior do arquivo tentando excluir as linhas acima do cursor! Obrigado pela ajuda!
Jonathan Chad Faling
Excluindo pelo número da roupa: ': <start>, $ d' será excluído até o final do arquivo.
Devolus
11

Se você preferir um método de modo não visual e reconhecer os números das linhas, gostaria de sugerir uma outra maneira direta.

Exemplo

Quero excluir o texto da linha 45 para a linha 101.

Meu método sugere que você digite um comando abaixo no modo de comando:

45Gd101G

Diz:

Vá para a linha 45 ( 45G) e exclua o texto ( d) da linha atual para a linha 101 ( 101G).

Observe que vimvocê pode usar ggno lugar de G.

Compare com a resposta da @Bonnie Varghese, que é:

:45,101d[enter]

O comando acima de sua resposta requer digitação 9 vezes enter, incluindo , onde minha resposta requer digitação de 8 a 10 vezes. Assim, uma velocidade do meu método é comparável.

Pessoalmente, eu mesmo prefiro 45Gd101Gmais :45,101dporque eu gosto de pau para a sintaxe de comando do vi, neste caso é:

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+
fronthem
fonte
8

d5d "corta" cinco linhas

Eu normalmente apenas jogo o número no meio como:

d7l = excluir 7 letras

Lon
fonte
7

Pressione a Esctecla para garantir que você não esteja no modo de edição. Coloque o cursor na primeira linha a ser excluída. Enter :5dd. A linha atual e as próximas quatro linhas devem ser excluídas.

Como alternativa, se você tiver a numeração de linha ativada ...

Pressione a Esctecla para garantir que você não esteja no modo de edição. Digite :#,#donde '#' significa os números das linhas inicial e final a serem excluídos.

Brian S. Wilson
fonte
Eu não acho que ele funcione com dois pontos no começo.
Outcast
@PoeteMaudit Esses são comandos vi válidos. Os dois pontos fazem com que o vi mova o cursor para a parte inferior da tela e aceite um comando do editor de linha.
Kenster # 22/18
5
  1. Esc para sair do modo de inserção
  2. :1enter vá para a linha 1 (substitua '1' pela linha em que você está interessado)
  3. 5dd exclua 5 linhas (da linha atual)

Digite (para linhas numeradas).:set number

JSON C11
fonte
3

Se você deseja excluir um intervalo APÓS um acionador de linha específico, você pode usar algo como isto

:g/^TMPDIR/ :.,+11d

Isso exclui 11 linhas (inclusive) após cada encontro de ^TMPDIR.

Evan Carroll
fonte
0

é dxd, não ddx

se você deseja excluir 5 linhas, cursor para o início da primeira linha a ser excluída e d5d

chris
fonte
0

Para excluir todas as linhas, use - ESC gg dG Para excluir algumas linhas, digamos 5 e use ESC 5dd

kalariya parikshith
fonte
-1

Isso pode ser feito da seguinte maneira ..

  1. Posicione o cursor no local que você deseja excluir.
  2. Pressione "v" para iniciar a seleção visual.
  3. Coloque o cursor na posição que deseja excluir usando a tecla de seta.
  4. Pressione "d" que excluirá as linhas.
  5. Agora salve e saia usando ": x!"
Sollymanul Islam
fonte