Der grep
Befehl gibt einen Exit-Status aus:
$echo "foo.bar" | grep -o foo
foo
$echo $?
0
$echo "foo.bar" | grep -o pop
$echo $?
1
Aber ich muss verwenden sed
und mir wurde klar, dass es keinen Exit-Status hat:
$echo "foo.bar" | sed 's/bar.*$//'
foo.
$echo $?
0
$echo "foo.bar" | sed 's/pop.*$//'
foo.bar
$echo $?
0
Ich weiß, dass ich mit der -q
Option herumspielen sollte, aber es ist mir nicht gelungen.
command-line
sed
Josef Klimuk
quelle
quelle
sed
Sicherheit einen Exit-Status gibt, der hier einfach nicht das tut, was Sie brauchen. Wenn dersed
Befehl fehlschlägt, z. B. wenn Sie versuchen, ihn für eine Datei auszuführen, auf die Sie keinen Schreibzugriff haben oder die nicht vorhanden ist,sed
wird er mit einem Exit-Status ungleich 0 beendet. Der Exit-Status gibt nur an, ob essed
geschafft hat, das zu tun, was Sie ihm gesagt haben, und ob esecho "foo.bar" | sed 's/pop.*$//'
korrekt ausgeführt wurde. Es wurden alle Zeilen mit gelöschtpop
. Dass es keine solchen Zeilen gab, ist irrelevant, der Befehl funktionierte immer noch.Antworten:
Sie können q verwenden n mit Exit - Status beenden n - aber das nützlich, müssen Sie auch nutzen , um einige machen Branching und Flow Control :
Es ist wahrscheinlich am besten, einen Wert für n zu wählen , der sich von einem der Standardwerte für den Exit-Status unterscheidet:
So zum Beispiel
wohingegen
Wenn Sie den Standarddruck des Musterbereichs weglassen möchten, ersetzen Sie ihn
q
durchQ
(beachten Sie, dass diesQ
eine GNU-Erweiterung ist).quelle
So suchen Sie Regex mit sed und markieren Übereinstimmungen oder geben den Exit-Code (5) zurück, wenn keine Übereinstimmung gefunden wurde:
Dies ist input.txt:
Hier ist meine Funktion, um alle zu drucken + Übereinstimmungen hervorzuheben + Exit-Code zurückzugeben:
Wenn keine Übereinstimmung vorliegt, wird der Exit-Code (5) zurückgegeben. Sie können es mit Katze und Pfeife verwenden auch:
* Keine Übereinstimmung gefunden *
Dank /unix//a/405725/43233 - Ich verwende die Option + sed quit.
quelle