Команда 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
опцией, но мне это не удалось.
command-line
sed
Йозеф Климук
источник
источник
sed
наверняка имеет статус выхода, он просто не делает то, что вам нужно здесь. Еслиsed
команда не выполнена, например, если вы попытаетесь запустить ее для файла, к которому у вас нет прав на запись или который не существует,sed
произойдет выход со статусом выхода, отличным от 0. Статус выхода просто указывает,sed
удалось ли вам выполнить то, что вы ему сказали, иecho "foo.bar" | sed 's/pop.*$//'
был ли он правильно выполнен. Он удалил все строки сpop
. То, что таких строк не было, не имеет значения, команда все еще работала.Ответы:
Вы можете использовать q n для выхода со статусом выхода n - но для того, чтобы сделать это полезным, вам также нужно будет использовать некоторые функции ветвления и управления потоком :
Вероятно, лучше выбрать значение для n , которое отличается от одного из стандартных значений состояния выхода:
Так например
в то время как
Если вы хотите опустить печать по умолчанию пространства шаблона, то замените
q
наQ
(обратите внимание, чтоQ
это расширение GNU).источник
Вот как найти регулярное выражение с помощью sed и выделить совпадения или вернуть код выхода (5), если совпадений не найдено:
Это input.txt:
Вот моя функция: распечатать все + выделить совпадения + код возврата:
Когда нет совпадения, он вернет код выхода (5). Вы можете использовать его с кошкой и трубой | также:
* Совпадение не найдено *
Благодаря https://unix.stackexchange.com/a/405725/43233 - я использую опцию + sed quit.
источник