구성 파일에 문자열이 있는지 확인하기 위해 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