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:]]
.
d
ist der Befehl zum Löschen der Zeile
w
Schreiben Sie die Datei
q
Beenden Sie den Editor
Diese Befehle werden ed
über einehier Dokument, angezeigt durch << EOF
. Die EOF
Zeichenfolge ist ein halb beliebiger Name, der mit den anderen EOF
vier Zeilen gepaart ist. Wenn die EOF
Anfü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 ed
Befehl/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 $1
ist 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 Suched
lösche die Zeile
Dann schreibt die nächste Zeile w
die Änderungen und q
beendet das Programm ed
.
Wirkung
Wenn die erste Zeile () der Datei $1
leer ist oder nur Leerzeichen (keine Tabulatoren) enthält, wird sie entfernt.