ファイル内の特定の行を検索して置換しようとしていますが、実行時にその正規表現がsed
一致しないとステータスコードが返されないため、sed
条件を追加する代わりにgrep
Enterメソッドがありますsed
。sed
終了状態?
質問:
答え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'
tm
m
交換が成功するとラベルに分岐します。ここに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
。