正規表現が一致しない場合、「sed」が終了ステータスを返さないのはなぜですか?

正規表現が一致しない場合、「sed」が終了ステータスを返さないのはなぜですか?

ファイル内の特定の行を検索して置換しようとしていますが、実行時にその正規表現がsed一致しないとステータスコードが返されないため、sed条件を追加する代わりにgrepEnterメソッドがありますsedsed終了状態?

質問:

ここに画像の説明を入力してください。

答え1

sed する戻り終了ステータス:

$ echo "foo" | sed 's/xx/yy/'
foo
$ echo $?
0
$ sed 's/xx/yy/' foo.txt
sed: can't read foo.txt: No such file or directory
$ echo $?
2

Sedの終了コードは、プログラムが正常に終了したかどうかに関連しており、実行中のジョブの内部とは無関係であり、コマンドが正常に実行されたかどうかのみが関係しますsed

つまり、GNU sedはこれを行う方法を提供します。

   q [exit-code]
          Immediately  quit  the sed script without pro‐
          cessing any more input, except that  if  auto-
          print  is  not  disabled  the  current pattern
          space will be printed.  The exit code argument
          is a GNU extension.

たとえば(からインポートここ):

$  echo "foo"|sed '/foo/ s/f/b/;q'                                                                       
boo
$  echo $?
0
$ echo "trash"|sed  '/foo/{s/f/b/;q}; /foo/!{q100}'
trash
$  echo $?
100

次の事実を報告したい場合どの入力のすべての行で交換が成功しました。予約済みスペースに正常な交換を表示し、最後の行で確認できます。

seq 6 | sed 's/4/four/;s/5/five/; tm;${x;/1/{x;q};x;q1};b;:m;x;s/.*/1/;x'

tmm交換が成功するとラベルに分岐します。ここに1最後の行で探す予約済みスペースを入れます。

答え2

まず、すべてのコマンド(含むsed)は終了ステータスを返します。あなたは私が失敗を返さない理由を探しています。これは2番目のポイントにつながります。

このようなプログラムはsed述語ではなく編集者です。彼らの目的は、プログラムを流れるデータを変更することです。エラー条件は、誤った内部コマンドやコマンドラインに存在しないファイルなどの状況を示します。

どのロジックが欲しいのかよく分からない。予想される出力は含まれていません。しかし、探しているものは次のようになるかもしれません。

$ sed '/^test line 7/s//#test line 7/;/^#test line 7/s//& \nAppend New Line/' test.txt
test line 1
test line 2
test line 3
test line 4
test line 5
test line 6
#test line 7
Append New Line

b同様に、これを処理する他の構造もありますsed

実際の戻りコードが見つからない場合は、その宣言を調べることをお勧めしgawkますexit

関連情報