grep: Как найти закрывающую скобку?

Эту оптимизацию выполняет не bash, а GNU tar. Он распознает, когда его вывод равен / dev / null , и не читает содержимое файлов.

Либо сделайте так, чтобы вывод не был / dev / null :

tar -cf - /mydirectory > /dev/zero

, либо используйте другой инструмент, например

find . | cpio -o >/dev/null
find . -type f -exec cat {} + >/dev/null
3
19.06.2016, 09:27
2 ответа

Этот sed скрипт печатает номер строки, соответствующей / ^}; / в диапазоне строки от / xkb_symbols "dvorak" {/ до следующего / ^}; / (который будет таким же }; как тот, мы получим строку номер для):

/xkb_symbols "dvorak" {/,/^};/{
        /^};/=
}

Если вам нужны номера как начальной, так и конечной строки:

/xkb_symbols "dvorak" {/,/^};/{
        /xkb_symbols "dvorak" {/=
        /^};/=
}

$ sed -n -f tiny_script.sed /usr/share/X11/xkb/symbols/us
192
248

Альтернативно:

$ sed -n -f - /usr/share/X11/xkb/symbols/us <<END_SED
/xkb_symbols "dvorak" {/,/^};/{
        /xkb_symbols "dvorak" {/=
        /^};/=
}
END_SED

ИЗМЕНИТЬ : чтобы получить эти два числа в переменной, при условии, что вы используете Bash:

pos=( $( sed -n -f - /usr/share/X11/xkb/symbols/us <<END_SED
        /xkb_symbols "dvorak" {/,/^};/{
                /xkb_symbols "dvorak" {/=
                /^};/=
        }
END_SED
) )

echo "start = " ${pos[0]}
echo "end   = " ${pos[1]}

Также , Привет! Еще один пользователь Дворжака!

4
27.01.2020, 21:12
#! /usr/bin/awk -f

/"dvorak"/ {dvorak++};

/{/ && dvorak {b++} ;

/}/ && dvorak {b--} ;

dvorak && b == 0 && NR > 1 {
    print NR;
    exit
}

$ ./find-dvorak.awk /usr/share/X11/xkb/symbols/us
248

Здесь используется счетчик ( b ), который увеличивается каждый раз, когда он видит открытую фигурную скобку { и уменьшается всякий раз, когда он видит закрывающую фигурную скобку } . Он также использует флаговую переменную ( dvorak ), чтобы узнать, находится ли она внутри строфы «dvorak» или нет.

Если b == 0 и номер строки больше единицы, выведите номер строки.

ОШИБКИ : не учитываются закомментированные скобки или скобки, встроенные в строки.

Если вам нужны номера строк открывающих и закрывающих скобок:

#! /usr/bin/awk -f

/"dvorak"/ {dvorak++};

/{/ && dvorak {
    b++;
    if (!first++) {
        print NR
    }
} ;

/}/ && dvorak {b--} ;

dvorak && b == 0 && NR > 1 {
    print NR;
    exit
}

$ ./find-dvorak2.awk /usr/share/X11/xkb/symbols/us
192
248

Вот версия, которая позволяет вам искать любую xkb_symbols строфу:

#! /usr/bin/awk -f

match($0,"xkb_symbols.*\""search"\"")  {found++};

/{/ && found {
    b++;
    if (!first++) {
        print NR
    }
} ;

/}/ && found {b--} ;

found && b == 0 && NR > 1 {
    print NR;
    exit
}

$ ./find-xkb_symbols.awk -v search=dvorak-intl /usr/share/X11/xkb/symbols/us
255
314
3
27.01.2020, 21:12

Теги

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