파일의 일부에서만 문자열 찾기(예: 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

관련 정보