/Delete/,/endif/p
?
invalid address
/Delere/,/endif/p
?
no match
Isso significa que ele entende apenas latim?
/Dele/,/endif/p
?
invalid address
/Del/,/endif/p
?
invalid address
Não, o que estou fazendo de errado? Estou digitando todas as letras sem nenhum erro.
Eu tenho o macOS.
A seguir está uma amostra do arquivo que estou editando que exibe o mesmo comportamento ao editá-lo usando o ed
comando acima:
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Editing mappings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Remap VIM 0 to first non-blank character
map 0 ^
" Move a line of text using ALT+[jk] or Command+[jk] on mac
nmap <M-j> mz:m+<cr>`z
nmap <M-k> mz:m-2<cr>`z
vmap <M-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <M-k> :m'<-2<cr>`>my`<mzgv`yo`z
if has("mac") || has("macunix")
nmap <D-j> <M-j>
nmap <D-k> <M-k>
vmap <D-j> <M-j>
vmap <D-k> <M-k>
endif
" Delete trailing white space on save, useful for some filetypes ;)
if has("autocmd")
autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces()
endif
O primeiro
endif
ocorre antes do primeiroDelete
, entãoed
fica confuso sobre o intervalo sendo especificado "para trás".Você vai querer primeiro encontrar a primeira ocorrência de e
Delete
, em seguida , aplicar o comando dessa linha para a próximaendif
:O primeiro comando colocará o cursor na primeira linha do arquivo que contém a palavra
Delete
, e o segundo comando imprimirá as linhas dessa linha até a próxima linha que contém a palavraendif
.Se você desse o mesmo comando em
vi
, ele reclamaria com "O segundo endereço é menor que o primeiro" evim
perguntaria "Intervalo reverso fornecido, OK para trocar (s/n)?" ao dar o comando de edição:/Delete/,/endif/p
.sed
não teria problemas, pois procura o primeiro endereço antes de começar a procurar o segundo endereço (já que é um editor de fluxo).Ed tem uma noção de " endereço atual "; você pode vê-lo com
.n
(imprima a linha atual com seu número anexado). Quando você abre um arquivo, ele é definido na última linha do arquivo.Se você especificar um endereço usando uma expressão regular, obterá a próxima linha abaixo do endereço atual que corresponde, agrupando-se no final do arquivo; portanto, após abrir um arquivo, as pesquisas começam na primeira linha.
Agora, se você especificar um intervalo de endereços com
/pattern1/,/pattern2/
, ed primeiro pesquisa porpattern1
iniciar no endereço atual e, em seguida, porpattern2
iniciar no endereço atual. O endereço atual não é alterado entre as duas pesquisas.Então, quando você procura por
/Delete/,/endif/
, o primeiro endereço corresponde à linha 20; em seguida, começamos a partir da última linha novamente eendif
combinamos na linha 18. Como o valor do primeiro endereço não pode exceder o valor do segundo, você obtém um erro.A solução é usar
;
para separar os endereços:Então você pode usar isso:
e você obtém as linhas 20-24:
E para excluí-los, conforme aludido nos comentários:
Isso usa o endereço
/Delete/-
para remover também a linha em branco antes daDelete
linha.Precisa
/startrange/,/endrange/d
. ExemploEu usaria apenas
sed
: