使用sed命令时如何获得退出状态?


11

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尝试使用该选项,但是我没有成功。


7
请注意,sed大多数情况下确实都具有退出状态,但是它并没有满足您的需要。sed例如,如果命令失败,则如果您尝试在没有写访问权限或不存在写访问权限的文件上运行该命令,sed则会以非0退出状态退出。退出状态仅表示是否已sed按照您要求的方式进行了操作,并echo "foo.bar" | sed 's/pop.*$//'已正确执行。它用删除了所有行pop。没有这样的行是无关紧要的,该命令仍然有效。
特登

@Zanna我要发布一个答案,但是我觉得这实际上并没有回答问题。它仅解释了一个误解,但没有像Steeldriver所提供的那样提供有用的解决方案。因此,发表评论似乎更合适。
特登

Answers:


13

您可以使用q n以退出状态n退出-但要使其有用,还需要使用一些“ 分支和流控制”

t
仅在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

如果要省略模式空间的默认打印,请替换qQ(请注意,这Q是GNU扩展)。


1

以下是使用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的东西牛逼
,我们将通过一个LO纳克的结束

如果没有匹配项,它将返回退出代码(5)。您可以将其与猫和烟斗一起使用| 以及:

$ cat input.txt | 突出显示“热\和” || echo -e“ \ n *未找到匹配项*”

你好,
我亲爱的老朋友

我们会经历很多事情

*未找到匹配项*

感谢https://unix.stackexchange.com/a/405725/43233-我正在使用它+ sed quit选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.