ed ungültige Adresse macOS

ed ungültige Adresse macOS
/Delete/,/endif/p
?
invalid address
/Delere/,/endif/p
?
no match

Bedeutet das, dass es nur Latein versteht?

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

Nein, was mache ich falsch? Ich tippe alle Buchstaben fehlerfrei ab.

Ich habe macOS.

Das Folgende ist ein Beispiel aus der Datei, die ich bearbeite. Es zeigt das gleiche Verhalten, wenn es mit dem obigen edBefehl bearbeitet wird:

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

Antwort1

Das erste endiftritt vor dem ersten auf Delete, sodass edes zu Verwirrung kommt, wenn der Bereich „rückwärts“ angegeben wird.

Sie möchten zuerst das erste Vorkommen von finden Delete,DannWenden Sie den Befehl von dieser Zeile bis zur nächsten an endif:

1,/Delete/
.,/endif/p

Der erste Befehl platziert den Cursor auf die erste Zeile der Datei, die das Wort enthält Delete, und der zweite Befehl druckt die Zeilen von dieser Zeile bis zur nächsten Zeile, die das Wort enthält endif.


Wenn Sie denselben Befehl in eingeben würden vi, würde es sich mit „Die zweite Adresse ist kleiner als die erste“ beschweren und vimbei der Eingabe des Bearbeitungsbefehls fragen: „Bereich rückwärts angegeben, Tauschen möglich (j/n)?“ :/Delete/,/endif/p.

sedwürde kein Problem geben, da es nach der ersten Adresse sucht, bevor es mit der Suche nach der zweiten Adresse beginnt (da es ein Stream-Editor ist).

Antwort2

Ed hat eine Vorstellung von „momentane Adresse"; Sie können es mit .n(drucken Sie die aktuelle Zeile mit vorangestellter Nummer) sehen. Wenn Sie eine Datei öffnen, wird es auf die letzte Zeile der Datei gesetzt.

Wenn Sie eine Adresse mithilfe eines regulären Ausdrucks angeben, erhalten Sie die nächste übereinstimmende Zeile unterhalb der aktuellen Adresse, wobei die Suche am Ende der Datei umgebrochen wird. Nach dem Öffnen einer Datei beginnen die Suchvorgänge also in der ersten Zeile.

Wenn Sie nun eine Adresse angebenReichweitemit /pattern1/,/pattern2/sucht ed zuerst nach pattern1beginnend ab der aktuellen Adresse, dann nach pattern2beginnend ab der aktuellen Adresse.Die aktuelle Adresse wird zwischen den beiden Suchvorgängen nicht geändert.

Wenn Sie also nach suchen /Delete/,/endif/, stimmt die erste Adresse mit Zeile 20 überein. Dann beginnen wir wieder mit der letzten Zeile und endiffinden die Übereinstimmung in Zeile 18. Da der Wert für die erste Adresse den Wert der zweiten Adresse nicht überschreiten kann, erhalten Sie eine Fehlermeldung.

Die Lösung besteht darin, ;zur Trennung der Adressen Folgendes zu verwenden:

In einem durch Semikolon getrennten Bereich .wird die aktuelle Adresse ( ) auf die erste Adresse gesetzt, bevor die zweite Adresse berechnet wird.

Sie können also Folgendes verwenden:

/Delete/;/endif/p

und Sie erhalten die Zeilen 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

Und um sie zu löschen, wie in den Kommentaren angedeutet:

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

Dabei wird die Adresse /Delete/-auch dazu verwendet, die Leerzeile vor der DeleteZeile zu entfernen.

Antwort3

Brauchen /startrange/,/endrange/d. Beispiel

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

Ich würde einfach verwenden sed:

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

verwandte Informationen