Rückgabecode von sed für keine Übereinstimmung
Ich bin mit sed
für die Aktualisierung meiner json Konfigurations-Datei in der runtime.
Manchmal, wenn das Muster nicht entspricht, in der json-Datei, noch sed
beendet sich mit return code 0.
Rückkehr " 0 " bedeutet erfolgreiche Ausführung an, aber warum macht sed
gibt 0 zurück, wenn Sie es nicht finden, das richtige Muster und die Datei aktualisieren? Gibt es eine Abhilfe für?
Dank!
Kommentar zu dem Problem
Ja, so weit als
sed
ist besorgt, es Tat seinen job: er versucht, die Datei zu editieren. Es gibt einen Fehler-code, wenn die Datei nicht lesbar oder sowas ähnliches. Kurz gesagt, ich glaube nicht, dass sed
ist das beste Werkzeug für die Entscheidung, auf ob ein pattern wird in eine Datei. @cnicutar viele Leute post als Kommentar beantworten, aber ich denke Sie setzen einfach die Antwort in den Kommentar-Bereich. und ich denke, der OP hat nicht nur wollen, um zu überprüfen, pattern match, er will etwas tun, wenn die Muster übereinstimmen.. wie
/pat/s/foo/bar/...
@Kent das ist, warum ich nicht posten eine Antwort. Ich habe erklärt, warum Sie die
sed
tut dies aber war nicht in der Lage, eine akzeptable Lösung. Alles, was ich denken konnte, beinhaltete das aufrufen einer separaten Befehl, bevor Sie die sed
, um zu entscheiden, ob die Datei passt. Im Idealfall gibt es eine Lösung (vielleicht awk
mit gsub
?) dass können dies tun, in einem Befehl. @cnicutar absolut vernünftig, ich habe nicht bemerkt, die "Abhilfe" - Anfrage..... kann ich diese Frage beantworten? gut, sicher, dass die Erklärung von Rückkehr-code Teil wäre die gleiche wie deine...
@Kent mit allen Mitteln, postet bitte eine Antwort 🙂
InformationsquelleAutor der Frage bram | 2013-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
als @cnicutar kommentiert, ist der Rückgabewert eines Befehls bedeutet, wenn das Kommando erfolgreich ausgeführt wurde. hat nichts zu tun mit der Logik, die Sie implementiert, in der codes/scripts.
also, wenn Sie haben:
sed zurück
0
aber wenn Sie schreiben, einige syntax - /expression-Fehler, oder die Eingabe/Datei existiert nicht, die sed nicht ausführen kann, Ihre Anfrage, sed 1 zurück.Abhilfe
dies ist eigentlich nicht Abhilfe. sed hat
q
Befehl: (aus der man-page):hier können Sie festlegen, exit-code, wie Sie wollen. zum Beispiel:
Fall abgestimmt:
unerreicht Fall:
Ich hoffe, das beantwortet Ihre Frage.
Bearbeiten
Muss ich hinzufügen, dass das obige Beispiel ist nur für one-line-Verarbeitung. Ich weiß nicht, Ihre genaue Anforderung. wenn Sie möchten, zu bekommen
exit 1
. one-line-unübertroffene oder die gesamte Datei. Wenn die gesamte Datei unmatching Fall, können Sie erwägen, awk, oder gar einegrep
vor Ihrer Textverarbeitung...InformationsquelleAutor der Antwort Kent
Könnte dies für Sie arbeiten (GNU sed):
Wenn die
search-string
gefunden wird, wird es ersetzt mitreplacement-string
und am Ende der Dateised
wird beendet, mit0
return-code. Wenn keine substitution stattfindet, ist der return-code wird1
.Eine ausführlichere Erklärung:
In der sed hat der Benutzer zwei Register zur Verfügung: die pattern-space (PS), in dem die aktuelle Zeile geladen wird (ohne Zeilenvorschub) und ein Ersatz-register genannt Raum (HS), die zunächst leer ist.
Die Allgemeine Idee ist, verwenden Sie die HS als ein flag, um anzuzeigen, wenn eine Ersetzung stattgefunden hat. Wenn der HS ist noch leer, am Ende der Datei, dann wurden keine änderungen vorgenommen, da sonst Veränderungen stattgefunden haben.
Den Befehl
/search-string/
entsprichtsearch-string
mit, was in der PS und wenn es gefunden wird, enthalten diesearch-string
die Befehle zwischen den folgenden geschweiften Klammern werden ausgeführt.Erstens die substitution
s//replacement-string/
(sed wird die letzten regexp-d.h. diesearch-string
, wenn die linke Seite leer ist, sos//replacement-string
ist das gleiche wies/search-string/replacement-string/
) und nach dieser dieh
Befehl erstellt eine Kopie der PS und bringt es in der HS.Den sed-Befehl
$
wird verwendet, um erkennen, die Letzte Zeile einer Datei und die folgenden dann Auftritt.Zuerst die
x
Befehl vertauscht die zwei Register, also das HS wird die PS und die PS wird die HS.Dann die PS gesucht wird für ein beliebiges Zeichen
/./
(.
bedeutet die Entsprechung ein beliebiges Zeichen) denken Sie an die HS (jetzt die PS) war zunächst leer, bis eine substitution stattgefunden hat. Wenn die Bedingung wahr ist, ist dasx
wird wieder ausgeführt, gefolgt vonq0
Befehl beendet alle sed-Verarbeitung und setzt den return-code zu0
. Ansonsten ist diex
Befehl wird ausgeführt und der Rückgabewert ist1
.N. B. obwohl die
q
beendet sed-Verarbeitung verhindert es nicht, dass die PS wird wieder durch sed und gedruckt wie pro normal.Andere alternative:
oder:
InformationsquelleAutor der Antwort potong
Diese Antworten sind alle zu kompliziert. Was ist falsch mit dem schreiben ein kleines shell-Skript, dass verwendet grep, um herauszufinden, ob die Sache, die Sie ersetzen möchten, ist es dann mit sed zu ersetzen?
InformationsquelleAutor der Antwort gilbertpilz
Unten ist das Muster, das wir verwenden, mit
sed -rn
odersed -r
.Die ganze suchen-und-ersetzen-Befehl ("s/.../.../...") ist optional. Wenn das suchen und ersetzen verwendet werden, für Geschwindigkeit und haben bereits abgestimmt $matchRe, verwenden wir so schnell einen $searchRe Wert wie möglich mit . wo der Charakter nicht, müssen neu überprüft und .{$len} für Feste Länge Abschnitte des Musters.
Den return-Wert keiner gefunden ist $notFoundExit.
Zwar aus folgenden Gründen:
Unterschiedlichen Fall von Q-Befehle variiert das Verhalten je nachdem, Wann die Abfahrt erfolgen sollte. Verhalten in Form der Anwendung der booleschen Logik zu einer mehrzeiligen Eingabe erfordert mehr Komplexität in die Lösung.
InformationsquelleAutor der Antwort Douglas Daseeco
Wollte ich abschneiden einer Datei zu beenden, wenn die übereinstimmung gefunden wurde (und schließen damit die entsprechende Zeile). Das ist praktisch, wenn ein Prozess, der fügt Zeilen am Ende der Datei kann erneut ausgeführt werden. "Q;Q1" hat nicht funktioniert, aber einfach "Q1" hat, wie folgt:
wenn sed-i '/text, den ich finden wollte/Q1 file.txt
dann
legen Sie einen leeren Zeile am Ende der Datei + neue Linien
fi
legen Sie nur die neuen Zeilen ohne Leerzeile
InformationsquelleAutor der Antwort Ronnie and Sandy
Wie wir bereits wissen, wenn die sed nicht die erwartete, dann ist es einfach gibt den input-string - kein Fehler aufgetreten ist. Es ist wahr, dass ein Unterschied zwischen der input-und output-strings, impliziert ein match, sondern ein match bedeutet nicht, dass eine Differenz in den Streichern, schließlich sed hätte auch einfach abgestimmt werden alle Eingabe-Zeichen.
Der Fehler ist im folgenden Beispiel erstellte
wo
g=Xabc1
gibt 1, während der Einstellungg=abc1
gibt 2; doch diese beiden Eingabe-strings sind aufeinander abgestimmt, durch die sed! Also, kann es schwierig sein zu bestimmen, ob die sed hat übereinstimmen oder nicht. Eine Lösung:in dem Fall die 1 wird ausgedruckt, wenn-und-nur-wenn sed verglichen hat.
InformationsquelleAutor der Antwort Dave Cole