ed endereço inválido macOS

4
/Delete/,/endif/p
?
invalid address
/Delere/,/endif/p
?
no match

Significa que entende apenas o 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, um exemplo do arquivo que estou editando que exibe o mesmo comportamento ao editá-lo usando o comando ed 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
    
por Adam 02.06.2018 / 12:16

3 respostas

4

O primeiro endif ocorre antes do primeiro Delete , por isso ed fica confuso sobre o intervalo especificado "para trás".

Você vai querer primeiro encontrar a primeira ocorrência de Delete , então aplicar o comando dessa linha até o próximo 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 . / p>

Se você fosse dar o mesmo comando em vi , ele iria reclamar com "O segundo endereço é menor do que o primeiro", e vim pediria "Intervalo para trás dado, OK para trocar (y / n) " ao dar o comando de edição :/Delete/,/endif/p .

sed não teria um problema ao procurar o primeiro endereço antes de começar a procurar pelo segundo endereço (já que é um editor de fluxo).

    
por 02.06.2018 / 13:53
1

Ed tem uma noção de " endereço atual "; você pode vê-lo com .n (imprima a linha atual com seu número prefixado). Quando você abre um arquivo, ele é definido para a última linha do arquivo.

Se você especificar um endereço usando uma expressão regular, obterá a próxima linha para baixo do endereço atual correspondente, contornando no final do arquivo, portanto, depois de abrir um arquivo, as pesquisas começarão na primeira linha.

Agora, se você especificar um endereço intervalo com /pattern1/,/pattern2/ , ed primeiro pesquisará pattern1 a partir do endereço atual e, em seguida, pattern2 a partir do endereço atual. O endereço atual não é alterado entre as duas pesquisas.

Portanto, quando você pesquisa por /Delete/,/endif/ , o primeiro endereço corresponde à linha 20; então, começamos da última linha novamente e endif corresponde na linha 18. Como o valor do primeiro endereço não pode exceder o valor do segundo, você recebe um erro.

A solução é usar ; para separar os endereços:

In a semicolon-delimited range, the current address (.) is set to the first address before the second address is calculated.

Então você pode usar isto:

/Delete/;/endif/p

e você recebe as linhas 20 a 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 mencionado nos comentários:

ed infile <<'EOE'
/Delete/-;/endif/d
wq
EOE

Isso usa o endereço /Delete/- para também remover a linha em branco antes da linha Delete .

    
por 31.08.2018 / 21:15
0

Precisa de /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 só usaria sed :

$ sed -i '/Delete/,/endif/d' inp
$
    
por 02.06.2018 / 12:40

Tags