sedは空のファイルに対してコマンドを実行できます(終了コマンド)。

sedは空のファイルに対してコマンドを実行できます(終了コマンド)。

ファイルの内容を確認したいシェルスクリプトがあります。

予想されるコンテンツには、具体的な最初の行が必要です。例^MYFIRSTROW:そして空にできません。

だから私はGNUを使ってこのチェックを書きましたsed

#!/bin/bash

# "1q1": return 1 on input line 1. Only reached if the pattern did not match.
if sed -rn '/^MYFIRSTROW/q0; 1q1' myfile; then
   # ...
fi

しかし、空の入力でテストしましたが、sed1の代わりに0が返されました。

echo -ne '' | sed -rn '/^MYFIRSTROW/q0; 1q1'; echo $?
# 0

そして、この場合、アドレス「0」の使用方法が見つかりませんでした。

GNU sedで1つのコマンドでこれを行う方法はありますか?

注:代替ソリューション

私は主に空の入力に対してsedコマンドを実行できるかどうか、そしてどのように実行できるかについて答えたいのですが、私のエレガントなシェルスクリプトの提案は大歓迎です。

  • 私は遅いですが、これがif [ -s "myfile" ] && sed ...仕事を終えることができることに気づきました。

  • while read < myfileソリューションの使用を想像できますが、面倒そうです。

  • awkENDブロックが常に実行される反対の問題があったため、このコードは常に1を返しました。

    awk 'NR==1 && /^MYPATTERN/ {exit 0}END{exit 1}' myfile
    

PS:すみません。私の質問はコードゴルフリクエストに似ているようですが、私のスクリプトで簡潔で効率的なファイル内容を確認したいと思います。

ベストアンサー1

主な答えは次のとおりです。いいえ。sed対応するスクリプトは行ごとに実行されるため、行がないとコマンドを実行できません。

回避策:今すぐシェルに行を追加してください。

sed -n '/^MYPATTERN/q;$q1;2q2' <(echo) yourfile

<(echo)空行が 1 つだけのファイルであるふりをするので、そのスクリプトはsed常に実行されます。空の場合、yourfile最初の行は最後の行でもあるため、$q1状態1で終了します。

それ以外の場合、スクリプトはの最初の行で実行されますyourfile。一致するものがあれば、ステータスコード0で終了します。

一致するものがない場合は存在し、sed状態は2です。追加されたラインファイルの最初の行はライン2として表示されますsed

kshスタイルのプロセス交換をサポートせずにシェルに対して同じ機能を達成する方法についてのヒントを提供したStéphane Chazelasに感謝します。

echo|sed -n '/^MYPATTERN/q;$q1;2q2' - yourfile

as-パラメータは、パイプから送信された空の行であるstdinを表しますecho

おすすめ記事