Как я получаю статус выхода при использовании команды sed?

grep команда выделяет статус выхода:

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

Но я должен использовать sed и я понял, что это не имеет никакого статуса выхода:

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

Я знаю, что должен играть вокруг с -q опция, но я не успешно выполнился.

9
задан 13 June 2018 в 11:53

2 ответа

Можно использовать qn для выхода со статусом выхода n - но сделать это полезным, необходимо будет также использовать некоторое Управление при разветвлении и Управление потоком:

t
перейдите условно (который является: перейдите к маркировке), только если a s/// команда успешно выполнилась, так как последняя входная строка была считана, или другой условный переход был взят.

Вероятно, лучше выбрать значение для n, который отличен от одного из стандартных значений статуса выхода:

Статус выхода нуля указывает на успех, и ненулевое значение указывает на отказ. GNU 'sed' возвращает следующие ошибочные значения статуса выхода:

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.

Так, например,

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

тогда как

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

Если Вы хотите опустить печать по умолчанию пространства шаблона, то замените q Q (отметьте это Q расширение GNU).

13
ответ дан 23 November 2019 в 04:57

Вот как искать регулярное выражение с помощью sed и выделить совпадения или вернуть код выхода (5), если совпадений не найдено:

Это это input.txt:

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

Вот моя функция: Распечатать все + Выделить совпадения + Код выхода возврата:

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

$ выделить "lo \ | end" input.txt || echo -e "\ n * совпадений не найдено *"

hel lo там
мой дорогой старый пт конец
а ло т
мы передадим lo в end

Если совпадения нет, он вернет код выхода (5). Вы также можете использовать его с cat и pipe | :

$ cat input.txt | выделить «горячие \ | и» || echo -e "\ n * совпадений не найдено *"

привет
мой дорогой старый друг
много чего
мы пройдем по концу

* совпадений не найдено *

Спасибо https://unix.stackexchange.com/a/405725/43233 - я использую его + sed quit вариант.

1
ответ дан 5 January 2020 в 15:42

Другие вопросы по тегам:

Похожие вопросы: