GNU/Linux >> Linux の 問題 >  >> Linux

一致しない場合の sed の戻りコード

@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

Linux
  1. Linux での sed コマンドの例

  2. sed:コマンドが見つかりません

  3. Linux grep リターン コード

  1. Linuxコマンドラインに関する8つのヒント

  2. id -r コマンドの適切な構文

  3. Linux の man コマンドの最新のソース コードはどこにありますか?

  1. Linuxユーザー向けの12のIPコマンド例

  2. 初心者向けのDNFコマンドの例

  3. Linux コマンドのソース コードを入手する