dirección no válida macOS

dirección no válida macOS
/Delete/,/endif/p
?
invalid address
/Delere/,/endif/p
?
no match

¿Significa que sólo entiende latín?

/Dele/,/endif/p
?
invalid address
/Del/,/endif/p
?
invalid address

No, ¿qué estoy haciendo mal? Estoy escribiendo todas las letras sin ningún error.

Tengo MacOS.

El siguiente es un ejemplo del archivo que estoy editando que muestra el mismo comportamiento al editarlo usando el edcomando anterior:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => 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

Respuesta1

El primero endifocurre antes del primero Delete, por lo que edse confunde acerca de que el rango se especifica "al revés".

Primero querrás encontrar la primera aparición de Delete,entoncesaplique el comando desde esa línea hasta la siguiente endif:

1,/Delete/
.,/endif/p

El primer comando colocará el cursor en la primera línea del archivo que contiene la palabra Delete, y el segundo comando imprimirá las líneas desde esa línea hasta la siguiente línea que contiene la palabra endif.


Si tuviera que dar el mismo comando en vi, se quejaría con "La segunda dirección es más pequeña que la primera" y vimpreguntaría "Rango hacia atrás dado, ¿está bien intercambiar (s/n)?" al dar el comando de edición :/Delete/,/endif/p.

sedno tendría ningún problema ya que busca la primera dirección antes de comenzar a buscar la segunda dirección (ya que es un editor de secuencias).

Respuesta2

Ed tiene una noción de "direccion actual"; puede verlo con .n(imprimir la línea actual con su número antepuesto). Cuando abre un archivo, se establece en la última línea del archivo.

Si especifica una dirección usando una expresión regular, obtendrá la siguiente línea hacia abajo de la dirección actual que coincide, y se ubicará al final del archivo, de modo que después de abrir un archivo, las búsquedas comiencen en la primera línea.

Ahora, si especifica una direcciónrangocon /pattern1/,/pattern2/, ed primero busca a pattern1partir de la dirección actual, luego a pattern2partir de la dirección actual.La dirección actual no cambia entre las dos búsquedas.

Entonces, cuando busca /Delete/,/endif/, la primera dirección coincide con la línea 20; luego, comenzamos nuevamente desde la última línea y endifcoincidimos en la línea 18. Debido a que el valor de la primera dirección no puede exceder el valor de la segunda, se obtiene un error.

La solución es utilizar ;para separar las direcciones:

En un rango delimitado por punto y coma, la dirección actual ( .) se establece en la primera dirección antes de calcular la segunda dirección.

Entonces puedes usar esto:

/Delete/;/endif/p

y obtienes las líneas 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

Y eliminarlos, como se alude en los comentarios:

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

Esto utiliza la dirección /Delete/-para eliminar también la línea en blanco antes de la Deletelínea.

Respuesta3

Necesidad /startrange/,/endrange/d. Ejemplo

$ cat inp
foo
Delete
these lines
endif
bar
$ ed inp
33
/Delete/,/endif/d
w
8
q
$ cat inp
foo
bar
$

Yo solo usaría sed:

$ sed -i '/Delete/,/endif/d' inp
$

información relacionada