ed-Befehl: Löschen von Zeile 1 bis zur ersten leeren Zeile

ed-Befehl: Löschen von Zeile 1 bis zur ersten leeren Zeile

Ich bin in einem Lehrbuch auf diesen Code gestoßen. Im Buch steht lediglich, dass er 1,/^[ ]*$/d „Löschen von Zeile 1 bis zur ersten leeren Zeile“ bedeutet. Was bedeutet jedes einzelne Zeichen im Einzelnen?

ed $1 << EOF
    1,/^[ ]*$/d
    w
    q
EOF

Antwort1

1,/.../bedeutet den Bereich von der 1. Zeile bis zu einer Zeile, die dem Muster zwischen den entspricht /.

/^[ ]*$/[ ]*passt zu einer Zeile, die vom Anfang ^bis zum Ende $der Zeile 0 oder eine beliebige Anzahl Leerzeichen enthält .
Es ist unklar, ob der Code in der Frage beabsichtigt ist und ob es sich um eine exakte Kopie aus dem Buch handelt. Klammern um ein einzelnes Leerzeichen sind nicht erforderlich. Vielleicht wollte der ursprüngliche Autor ein Leerzeichen und ein Tabulatorzeichen zwischen den Klammern haben, die durch die Zeichenklasse ersetzt werden könnten [[:blank:]].

dist der Befehl zum Löschen der Zeile

wSchreiben Sie die Datei

qBeenden Sie den Editor

Diese Befehle werden edüber einehier Dokument, angezeigt durch << EOF. Die EOFZeichenfolge ist ein halb beliebiger Name, der mit den anderen EOFvier Zeilen gepaart ist. Wenn die EOFAnführungszeichen weggelassen werden, bedeutet dies, dass alle Variablen in den dazwischenliegenden Zeilen erweitert werden.

Beachten Sie hier auch die nicht in Anführungszeichen gesetzten $1. Der edBefehl/das Skript wird mit dem ersten Positionsparameter (Argument für das Skript oder die Funktion) ausgeführt.unterliegt weiterer Aufteilung der Leerzeichen und Generierung von Dateinamen. Das Argument sollte wirklich zitiert werden. Weitere Informationen finden Sie unterWarum gerät mein Shell-Skript ins Stocken, wenn es sich um Leerzeichen oder andere Sonderzeichen handelt?UndSicherheitsimplikationen, wenn vergessen wird, eine Variable in Bash/POSIX-Shells in Anführungszeichen zu setzen.

Antwort2

Befehl und Eingabe

Dies $1ist der zu bearbeitende Dateiname und alles zwischen den EOFs sind Befehle an ed.

Schlag für Schlag Beschreibung von1,/^[ ]*$/d

  • 1,ab Zeile beginnen1 und in diesem Fall fortfahren bis zum ersten Vorkommen des Suchbegriffs
  • /zeigt an, dass wir nach einer Zeichenfolge suchen
  • ^gibt an, dass wir den Zeilenanfang in der Datei abgleichen möchten
  • [zeigt an, dass wir viele Zeichen angeben werden
  • ' ' wir wollen ein Leerzeichen finden - normalerweise wären hier mehr Zeichen
  • ]Fertig mit der Zeichenspezifizierung
  • *[]wir wollen 0 oder mehr Leerzeichen (oder beliebige Zeichen dazwischen ) abgleichen
  • $bis zum Ende der Zeile in der Datei
  • /Schließung der Suche
  • dlösche die Zeile

Dann schreibt die nächste Zeile wdie Änderungen und qbeendet das Programm ed.

Wirkung

Wenn die erste Zeile () der Datei $1leer ist oder nur Leerzeichen (keine Tabulatoren) enthält, wird sie entfernt.

verwandte Informationen