ed endereço inválido macOS

ed endereço inválido macOS
/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 edcomando 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 endifocorre antes do first Delete, então edfica 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 Deletee 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 vimperguntaria "Intervalo inverso fornecido, OK para trocar (s/n)?" ao dar o comando de edição :/Delete/,/endif/p.

sednã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 pattern1começando no endereço atual e depois pattern2começ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 endifcorrespondemos à 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 Deletelinha.

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
$

informação relacionada