Ubuntu – How to get the exit status when using the sed command

command linesed

The grep command gives out an exit status:

$echo "foo.bar" | grep -o foo
foo
$echo $?
0
$echo "foo.bar" | grep -o pop
$echo $?
1  

But I need to use sed and I realized that it has no exit status:

$echo "foo.bar" | sed 's/bar.*$//'
foo.
$echo $?
0
$echo "foo.bar" | sed 's/pop.*$//'
foo.bar
$echo $?
0  

I know that I should play around with the -q option, but I have not succeeded.

Best Answer

You can use qn to quit with exit status n - but to make that useful, you will also need to use some Branching and Flow Control:

t
branch conditionally (that is: jump to a label) only if a s/// command has succeeded since the last input line was read or another conditional branch was taken.

It is probably best to choose a value for n that is distinct from one of the standard exit status values:

An exit status of zero indicates success, and a nonzero value indicates failure. GNU 'sed' returns the following exit status error values:

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 for example

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

whereas

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

If you want to omit the default printing of the pattern space, then replace q by Q (note that Q is a GNU extension).