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
опция, но я не успешно выполнился.
Можно использовать qn для выхода со статусом выхода n - но сделать это полезным, необходимо будет также использовать некоторое Управление при разветвлении и Управление потоком:
t
перейдите условно (который является: перейдите к маркировке), только если as///
команда успешно выполнилась, так как последняя входная строка была считана, или другой условный переход был взят.
Вероятно, лучше выбрать значение для 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).
Вот как искать регулярное выражение с помощью 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 вариант.