Найдите строку (как grep-q) только в разделе файла

Я недавно записал сценарий для работы, которая была универсальна и допускала несколько видов переключателей в любом порядке. Я не могу раскрыть полный сценарий по очевидным легальным причинам (не говоря уже о, у меня нет его со мной в данный момент), но вот суть его.. можно поместить его в подпрограмму и назвать его в конце сценария:

options () {

    if [ -n "$1" ]; then # test if any arguments passed - $1 will always exist
        while (( "$#" )); do  # process ALL arguments
            if [ "$1" = ^-t$ ]; then # -t short for "test"
                # do something here THEN shift the argument
                # shift removes it from $@ and reduces $# by
                # one if you supply no argument
                shift

            # we can also process multiple arguments at once
            elif [[ "$1" =~ ^--test=[:alnum:]{1,8}$ ]] && [[ "$2" =~ ^-t2$ ]] && [[ -n "$3" ]]; then # check for 3 arguments
                # do something more then remove them ALL from the arg list    
                shift 3
            else
                echo "No matching arguments!"
                echo "Usage: [script options list here]"
            fi
        done
    else
        echo "Usage: [script options list here]"
        exit 0
    fi
}

options "$@" # run options and loop through/process ALL arguments

Я действительно рекомендую ограничить Ваш сценарий удара меньше чем 400 lines/15k символами; мой вышеупомянутый сценарий вырос мимо этого размера и стал значительно трудным продолжить работать. Я начал переписывать его в Perl, который намного лучше подходит для задачи. Имейте это в виду, поскольку Вы работаете над своими сценариями в ударе. Bash является большим для маленьких сценариев и острот, но что-либо более сложное и Вы являетесь более обеспеченной записью его в Perl.

Отметьте, у меня нет тестового вышеупомянутого, таким образом, оно, вероятно, не работает, но Вы в общих чертах понимаете от него.

4
05.11.2011, 00:18
4 ответа

Каждый раз, когда сталкивающийся с проблемой обработки текста, некоторые люди говорят, “давайте использовать awk”. Как правило, у них есть решение.

awk '
    /^\[.*\]$/ {group = $0}
    group == "[group1]" && $1 == "MyParameter" {found=1; exit}
    END {exit !found}
'
7
27.01.2020, 20:47
  • 1
    Хороший. Что это делает (как объяснение к непосвященному): это помнит последнее замеченное название группы (то в квадратных скобках) при прохождении через файла. И когда это встречается с параметром вместе с корректной группой, это устанавливает флаг found к 1. В конце это выходит с соответствующим кодом состояния (0, если параметрический усилитель был найден в корректной группе). –  Axel Knauf 05.11.2011, 18:16

С GNU sed можно сделать

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

это запишет MyParameter только, когда это находится в group1 раздел. Если раздел после group1 не всегда group2, можно занять место group2 с .*.

3
27.01.2020, 20:47
  • 1
    (+1) /^MyParameter&/ разрешит встроенное соответствие шаблона (например, MyParameters) –  Peter.O 06.11.2011, 10:07

Вот сценарий 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";
}
2
27.01.2020, 20:47
if [ `egrep 'MyParameter|^\[.*\]$' file.conf | head -2 | tail -1` == "MyParameter" ]
then 
  echo Success
else 
  echo Failure
fi
0
27.01.2020, 20:47
  • 1
    Это работает, когда [group1] первая группа, иначе она возвращает Отказ.. Интересно, было ли это намерением вопроса? –  Peter.O 06.11.2011, 10:08
  • 2
    @fered Хорошо мы должны спросить автору вопроса... –  ztank1013 06.11.2011, 11:53

Теги

Похожие вопросы