ファイルの一部でのみ文字列を検索する(例:grep -q)

ファイルの一部でのみ文字列を検索する(例:grep -q)

設定ファイルに文字列があるかどうかを確認するためにBashを作成したいと思います。ファイル形式を変更できません。他のアプリケーションに属しています。

ファイルは、角かっこ内の文字列で指定されたグループに細分化されます。

これは成功するはずです。

[group1]
MyParameter
junk1
junk2

[group2]
junk3
junk4

以下はエラーです。

[group1]
junk1
junk2

[group2]
MyParameter
junk3
junk4

grep -qファイルにそのファイルがあるかどうかを確認するには、aを実行できますが、そのファイルが内のグループとは異なるグループにMyParameterある場合は、group1エラーが発生します。

両方のグループに存在する場合、MyParameterエラーがgroup1

行番号(頭、尾など)には依存できません。またgroup2、名前に依存しないほど一般的であれば良いでしょう(スクリプトは角かっこで始まり、終わり、前のセットを終了する別の行を見つけた場合にのみわかります)。

答え1

テキスト処理に問題があるたびに、誰かが「awkを使用しよう」と言います。一般的に解決策があります。

awk '
    /^\[.*\]$/ {group = $0}
    group == "[group1]" && $1 == "MyParameter" {found=1; exit}
    END {exit !found}
'

答え2

GNUを使えsedばできます

sed -n '/\[group1\]/,/\[group2\]/{/MyParameter/p}' input-file

MyParameterそのセクションにある場合にのみ作成されますgroup1。後者の部分がgroup1常に利用可能でない場合に置き換えることgroup2ができます。group2.*

答え3

以下は、タスクを実行するPerlスクリプトです。

#!/usr/bin/perl

use strict;
use warnings;

die "Usage: $0 group pattern [file...]\n" if scalar @ARGV < 2;

my $group = shift;
my $pattern = shift;

my $curr_group = undef;
my $matched = 0;
while (<>) {
    if (/^\[(.*)\]/) {
        $curr_group = $1;
    }
    else {
        if (defined $curr_group and 
            $curr_group eq $group and 
            /$pattern/) 
        {   
            print "Match\n";
            $matched = 1;
        }
    }
}

if (not $matched) {
    print "No match\n";
}

答え4

if [ `egrep 'MyParameter|^\[.*\]$' file.conf | head -2 | tail -1` == "MyParameter" ]
then 
  echo Success
else 
  echo Failure
fi

関連情報