Wie erhalte ich den Exit-Status, wenn ich den Befehl sed verwende?

11

Der grepBefehl 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 sedund 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 -qOption herumspielen sollte, aber es ist mir nicht gelungen.

Josef Klimuk
quelle
7
Beachten Sie, dass es mit sedSicherheit einen Exit-Status gibt, der hier einfach nicht das tut, was Sie brauchen. Wenn der sedBefehl 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, sedwird er mit einem Exit-Status ungleich 0 beendet. Der Exit-Status gibt nur an, ob es sedgeschafft hat, das zu tun, was Sie ihm gesagt haben, und ob es echo "foo.bar" | sed 's/pop.*$//'korrekt ausgeführt wurde. Es wurden alle Zeilen mit gelöscht pop. Dass es keine solchen Zeilen gab, ist irrelevant, der Befehl funktionierte immer noch.
Terdon
@Zanna Ich wollte eine Antwort posten, aber ich hatte das Gefühl, dass dies die Frage nicht wirklich beantwortet. Es erklärt nur ein Missverständnis, bietet aber keine hilfreiche Lösung, wie sie der Stahlfahrer unten hat. Ein Kommentar schien also angemessener.
Terdon

Antworten:

13

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 :

t
Bedingt verzweigen (dh zu einer Beschriftung springen) nur, wenn ein s/// Befehl erfolgreich war, seit die letzte Eingabezeile gelesen oder eine andere bedingte Verzweigung durchgeführt wurde.

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:

Ein Exit-Status von Null zeigt Erfolg an, und ein Wert ungleich Null zeigt einen Fehler an. GNU 'sed' gibt die folgenden Fehlerwerte für den Exit-Status zurück:

0
 Successful completion.

1
 Invalid command, invalid syntax, invalid regular expression or a
 GNU 'sed' extension command used with '--posix'.

2
 One or more of the input file specified on the command line could
 not be opened (e.g.  if a file is not found, or read permission is
 denied).  Processing continued with other files.

4
 An I/O error, or a serious processing error during runtime, GNU
 'sed' aborted immediately.

So zum Beispiel

$ echo "foo.bar" | sed 's/bar.*$//; t; q42' ; echo $? 
foo.
0

wohingegen

$ echo "foo.bar" | sed 's/baz.*$//; t; q42' ; echo $? 
foo.bar
42

Wenn Sie den Standarddruck des Musterbereichs weglassen möchten, ersetzen Sie ihn qdurch Q(beachten Sie, dass dies Qeine GNU-Erweiterung ist).

Steeldriver
quelle
1

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:

hello there
my dear old friend
a lot of things
we'll pass along the end

Hier ist meine Funktion, um alle zu drucken + Übereinstimmungen hervorzuheben + Exit-Code zurückzugeben:

highlight()
{
  pattern=$1
  shift
  sed '/'"${pattern}"'/,${s//\x1b[32m&\x1b[0m/g;b};$q5' "$@"
}

$ Highlight "lo \ | end" input.txt || echo -e "\ n * Keine Übereinstimmung gefunden *"

hel lo dort
mein lieber alter fri Ende
ein lo t der Dinge werden
wir einen Pass lo ng das Ende

Wenn keine Übereinstimmung vorliegt, wird der Exit-Code (5) zurückgegeben. Sie können es mit Katze und Pfeife verwenden auch:

$ cat input.txt | Markieren Sie "hot \ | und" || echo -e "\ n * Keine Übereinstimmung gefunden *"

Hallo
mein lieber alter Freund,
viele Dinge werden
wir am Ende weitergeben

* Keine Übereinstimmung gefunden *

Dank /unix//a/405725/43233 - Ich verwende die Option + sed quit.

Noam Manos
quelle