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の終了ステータスで終了します。終了ステータスは、ユーザーが指示sedecho "foo.bar" | sed 's/pop.*$//'たとおりに実行でき、正しく実行されたかどうかを示すだけです。ですべての行を削除しましたpop。そのような行がなかったことは無関係です、コマンドはまだ機能しました。
terdon 2018年

@Zanna回答を投稿するつもりでしたが、実際には質問に対する回答ではないと感じました。それは誤解を説明するだけですが、steeldriverが以下に持っているような有用な解決策を提供しません。したがって、コメントの方が適切であるように思われました。
terdon 2018年

回答:


13

q nを使用して終了ステータスnで終了することができますが、これを有効にするには、いくつかの分岐とフロー制御も使用する必要があります。

t 最後の入力行が読み取られてからコマンドが成功した
場合、s///または別の条件付き分岐が行われた場合にのみ、条件付きで分岐します(つまり、ラベルにジャンプします)。

おそらく、標準の終了ステータス値の1つとは異なる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(ノートQGNUの拡張です)。


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 ngの終わりを

一致しない場合は、終了コード(5)を返します。猫とパイプで使えます| 同様に:

$ cat input.txt | "hot \ | and"を強調表示する|| echo -e "\ n *一致するものが見つかりません*"

こんにちは、
私の親愛なる旧友

私たちが最後に渡す多くのこと

*一致するものが見つかりません*

https://unix.stackexchange.com/a/405725/43233に感謝-私はそれとsed quitオプションを使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.