構成ファイルがあります。
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関連の側面を考慮すると、sed
GNUを使用しているようです)。0,/.../
if sed -n '/device: 1000/q; /^\[old\]/Q1' < file; then
echo OK
fi
(、終了状態0(成功)で終了する標準形式ですq
が、終了状態1(0ではないため失敗)で終了する標準形式です。Q0
Q1
標準を使用すると、終了ステータスを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