ファイルの別の行にある別の文字列の前に文字列があるかどうかをテストする方法

ファイルの別の行にある別の文字列の前に文字列があるかどうかをテストする方法

構成ファイルがあります。

a: 123
b: abc
device: 1000
c: xyz

[old]
a: 120
b: xyz
device: 200
c: abc

「[old]」セクションとその下のすべての項目が常に存在するわけではありません。

ファイルのオプションの「[old]」セクションの前に「device:1000」テキストがあるかどうかを確認するには?

次の(壊れた)コマンド構文に触れましたが、必要なことはできません...

sed -e '0,/^\[/;  /device: /p' configfile ; echo $?

...0,/^\[/ファイルの先頭と最初の列で「[」が最初に表示される部分の間の検索を制限する必要があります。文字列が見つかったかどうかを示す戻りコードを取得しようとしています。

答え1

awkオプションの場合:

awk 'BEGIN{o=d=1} /\[old\]/{o=0} /device: 1000/&&o==1{d=0;exit} END{exit d}' file

説明する:

  • BEGIN{o=d=1}:変数の初期化
  • /\[old\]/{o=0}if [old]:設定されていることが確認されましたo=0
  • /device: 1000/&&o==1{d=0;exit}device: 1000見つかったが[old]まだ見つからない場合は、ファイルを確認せずにd=0ブロックを設定してジャンプします。END{}
  • END{exit d}: 与えられた値で終了d

次のように実行します。

awk 'BEGIN{o=d=1} /\[old\]/{o=0} /device: 1000/&&o==1{d=0;exit} END{exit d}' file && echo "contains" || echo "contains not"

答え2

私は通常sedを使用して複数の行を変数にキャプチャしてブロブを作成します。前提条件が満たされたら、後で確認できます。

blob=“$(sed -n “/^abc.*$/,/^$/p” file)”

今、ファイルの上部を”${blob}”

次に、条件付きで存在することを確認${blob}します[old]

sh if [ $(grep -c “^\[old/]$” file) -gt 0 ]; then echo “${blob}” | grep “^device” | grep -c 1000 fi

これはリファクタリングできると確信していますが、これを行うと望ましい結果が得られます。

答え3

device: 1000次の内容をすべて削除したら、それを見つけることができます[old]

if sed '/^\[old\]/q' < file | grep -q 'device: 1000'; then
  echo OK
fi

GNUを使用してください(あなたの方法のGNU関連の側面を考慮すると、sedGNUを使用しているようです)。0,/.../

if sed -n '/device: 1000/q; /^\[old\]/Q1' < file; then
  echo OK
fi

(、終了状態0(成功)で終了する標準形式ですqが、終了状態1(0ではないため失敗)で終了する標準形式です。Q0Q1

標準を使用すると、終了ステータスをsed変更することはできませんが、何かを出力するかどうかに依存できます。sed

if [ -n "$(sed -n '/^\[old\]/q;/device: 1000/!d;=;q' < file)" ]; then
  echo OK
fi

=行番号の最初の項目が出力されますdevice: 1000。)

または、awkこれを使用して終了ステータスを移植可能に設定できます。

if awk '$0 == "[old]" {exit 1}; /device: 1000/ {exit 0}' < file; then
  echo OK
fi

関連情報