Ich versuche, eine Zeile aus Dateien zu suchen und zu ersetzen, aber wenn ich sie ausführe, sed
wenn dieser reguläre Ausdruck nicht übereinstimmt, sed
wird kein Statuscode zurückgegeben. Anstatt also eine weitere Bedingung mit hinzuzufügen grep
, gibt es einen Weg hinein sed
und Warum sed
wird der Exit-Status nicht zurückgegeben ?
Problem :
Antworten:
sed
gibt einen Exit-Status zurück:In den Exit-Codes von Sed geht es darum, ob das Programm erfolgreich beendet wurde oder nicht. Sie haben nichts mit den Interna zu
sed
tun, sondern nur damit, ob der Befehl ausgeführt werden konnte oder nicht.Trotzdem bietet GNU sed eine Möglichkeit, dies zu tun:
Zum Beispiel (von hier genommen ):
Wenn Sie die Tatsache melden möchten, dass eine Substitution in einer Zeile der Eingabe erfolgreich war, können Sie erfolgreiche Substitutionen im Haltebereich markieren und in der letzten Zeile überprüfen:
tm
Verzweigt zumm
Etikett, wenn eine Substitution erfolgreich war. Dort setzen wir1
den Laderaum ein, den wir in der letzten Zeile suchen.quelle
grep
ist jedoch keine gute Analogie. Grep ist ein einfaches Programm, das nur eines kann: nach Mustern suchen. Wenn es es nicht findet, kann es Sie wissen lassen. Essed
ist jedoch etwas völlig anderes und weitaus komplexer. Es ist im Grunde eine Skriptsprache, mit der Sie beliebige Aufgaben ausführen können. Es kann nicht festgestellt werden, ob es "erfolgreich" war, da der Erfolg von den Details des Skripts abhängt, das Sie ausführen. Wie in allen Programmiersprachen ist es daher Sache des Programmierers, den Exit-Status zu definieren.Zunächst geben alle Befehle, einschließlich
sed
, einen Exit-Status zurück. Sie suchen nach dem Grund, warum ich einen Fehler nicht zurückgeben würde. Was zum zweiten Punkt führt.Programme wie
sed
sind Editoren, keine Prädikate. Sie dienen dazu, die durch das Programm fließenden Daten zu ändern. Fehlerbedingungen gelten für Bedingungen wie ungültige interne Befehle oder eine nicht vorhandene Datei in der Befehlszeile.Ich bin mir nicht sicher, welche Logik Sie wollen - Sie schließen keine erwartete Ausgabe ein -, aber dies könnte das sein, wonach Sie suchen:
Es gibt andere Konstrukte, die dies ebenfalls verarbeiten können, beispielsweise den
b
Befehl (branch) insed
.Wenn Sie einen tatsächlichen Rückkehrcode wünschen, falls dieser nicht gefunden wird, sollten Sie sich
gawk
dessenexit
Anweisung ansehen .quelle
T
zwischen den beiden hinzufügen :sed -i '/^test line 7/s//#&/;T;/#test line 7/&\nAppend New Line/' test.txt