
/Delete/,/endif/p
?
invalid address
/Delere/,/endif/p
?
no match
Isso significa que 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 erros.
Eu tenho macOS.
A seguir está um exemplo do arquivo que estou editando e 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
Responder1
O primeiro endif
ocorre antes do first Delete
, então ed
fica confuso sobre o intervalo especificado "ao contrário".
Você desejará primeiro encontrar a primeira ocorrência de Delete
,entãoaplique o comando dessa linha até a próxima endif
:
1,/Delete/
.,/endif/p
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 palavra endif
.
Se você desse o mesmo comando em vi
, ele reclamaria com "O segundo endereço é menor que o primeiro" e vim
perguntaria "Intervalo inverso 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).
Responder2
Ed tem uma noção de "Morada atual"; você pode vê-lo com .n
(imprimir a linha atual com seu número anexado). Quando você abre um arquivo, ele é definido como a ú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 correspondente, terminando no final do arquivo, portanto, após abrir um arquivo, as pesquisas começarão na primeira linha.
Agora, se você especificar um endereçofaixacom /pattern1/,/pattern2/
, ed primeiro pesquisa pattern1
começando no endereço atual e depois pattern2
começando no endereço atual.O endereço atual não é alterado entre as duas pesquisas.
Então, quando você pesquisa por /Delete/,/endif/
, o primeiro endereço corresponde à linha 20; então, começamos da última linha novamente e endif
correspondemos à linha 18. Como o valor do primeiro endereço não pode exceder o valor do segundo, você receberá um erro.
A solução é usar ;
para separar os endereços:
Em um intervalo delimitado por ponto e vírgula, o endereço atual (
.
) é definido como o primeiro endereço antes que o segundo endereço seja calculado.
Então você pode usar isso:
/Delete/;/endif/p
e você obtém as linhas 20-24:
/Delete/;/endif/p
" Delete trailing white space on save, useful for some filetypes ;)
if has("autocmd")
autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces()
endif
E para excluí-los, conforme aludido nos comentários:
ed infile <<'EOE'
/Delete/-;/endif/d
wq
EOE
Isso usa o endereço /Delete/-
para remover também a linha em branco antes da Delete
linha.
Responder3
Precisar /startrange/,/endrange/d
. Exemplo
$ cat inp
foo
Delete
these lines
endif
bar
$ ed inp
33
/Delete/,/endif/d
w
8
q
$ cat inp
foo
bar
$
Eu apenas usaria sed
:
$ sed -i '/Delete/,/endif/d' inp
$