設定ファイルに文字列があるかどうかを確認するために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