@cnicutar がコメントしたように、コマンドの戻りコードは、コマンドが正常に実行されたかどうかを意味します。コード/スクリプトに実装したロジックとは関係ありません。
あなたが持っている場合:
echo "foo"|sed '/bar/ s/a/b/'
sed は 0
を返します ただし、構文/式エラーを記述した場合、または入力/ファイルが存在しない場合、sed は要求を実行できず、sed は 1 を返します。
回避策
これは実際には回避策ではありません . sed には q
があります コマンド:(man ページから):
q [exit-code]
ここで、必要に応じて終了コードを定義できます。例えば '/foo/!{q100}; {s/f/b/}'
foo
の場合、コード 100 で終了します そうでなければ、置換 f->b を実行し、コード 0 で終了します。
大文字と小文字の一致:
kent$ echo "foo" | sed '/foo/!{q100}; {s/f/b/}'
boo
kent$ echo $?
0
一致しないケース:
kent$ echo "trash" | sed '/foo/!{q100}; {s/f/b/}'
trash
kent$ echo $?
100
これがあなたの質問に答えてくれることを願っています.
編集
追加しなければなりませんが、上記の例は 1 行の処理用です。私はあなたの正確な要件を知りません。 exit 1
を取得したい場合 . 1 行の不一致またはファイル全体。ファイル全体が一致しない場合は、awk を検討するか、 grep
を実行することもできます テキスト処理の前に...
これはうまくいくかもしれません (GNU sed):
sed '/search-string/{s//replacement-string/;h};${x;/./{x;q0};x;q1}' file
search-string
の場合 replacement-string
に置き換えられます そしてファイルの終わり sed
0
で終了します 戻りコード。置換が行われない場合、リターン コードは 1
になります。 .
より詳細な説明:
sed では、ユーザーは 2 つのレジスタを自由に使用できます。現在の行がロードされるパターン スペース (PS) (ラインフィードを除く) と、最初は空であるホールド スペース (HS) と呼ばれるスペア レジスタです。
一般的な考え方は、HS をフラグとして使用して、置換が行われたかどうかを示すことです。ファイルの最後で HS がまだ空の場合、変更は行われていません。それ以外の場合は、変更が行われています。
コマンド /search-string/
search-string
に一致 PS にあるものは何でも、search-string
が含まれていることが判明した場合 次の中括弧の間のコマンドが実行されます。
まず、置換 s//replacement-string/
(sed は最後の正規表現、つまり search-string
を使用します 、左側が空の場合は s//replacement-string
s/search-string/replacement-string/
と同じです ) そしてこれに続いて h
コマンドは PS のコピーを作成し、それを HS に配置します。
sed コマンド $
まず x
コマンドは 2 つのレジスタを交換するため、HS が PS になり、PS が HS になります。
次に、PS で任意の文字 /./
が検索されます。 (.
は、任意の文字に一致することを意味します) HS (現在は PS) は、置換が行われるまで最初は空だったことを思い出してください。条件が真の場合、x
q0
に続いて再度実行されます すべての sed 処理を終了し、リターン コードを 0
に設定するコマンド .それ以外の場合は x
コマンドが実行され、リターン コードが 1
に設定されます .
N.B. q
sed 処理を終了しますが、PS が sed によって再構築され、通常どおりに印刷されることを妨げません。
別の方法:
sed '/search-string/!ba;s//replacement-string/;h;:a;$!b;p;x;/./Q;Q1' file
または:
sed '/search-string/,${s//replacement-string/;b};$q1' file
これらの答えはすべて複雑すぎます。 grep を使用して置き換えたいものが存在するかどうかを判断し、sed を使用してそれを置き換えるシェル スクリプトを作成することの何が問題になっていますか?
grep -q $TARGET_STRING $file
if [ $? -eq 0 ]
then
echo "$file contains the old site"
sed -e "s|${TARGET_STRING}|${NEW_STRING}|g" ....
fi