Используйте команду sed, чтобы применить условие для проверки соответствия шаблона

Вы можете настроить их размещение и внешний вид: http://www.omgubuntu.co.uk/2010/06/customize-the-ubunt-notification-bubbles/

1
задан 11 June 2015 в 17:27

4 ответа

С GNU sed (как установлено по умолчанию в любой системе Ubuntu):

{ sed -n '/::=BEGIN/Q 1'; i=$?; } <infile

Некоторые факты об этом ответе:

sed Q uits input, как только будет найдено самое первое совпадение в любом месте файла, что означает, что он больше не тратит время на чтение infile. sed возвращает в своем коде выхода числовое значение 0 или 1 в зависимости от того, не может / не может найти адресованное регулярное выражение. $i установлен на sed при возврате. Группировка { ; } используется для надежной обработки любой возможной ошибки перенаправления - $i не устанавливается в случае, если оболочка не может открыть файл вообще, избегая при этом ложных срабатываний.

Это, вероятно, не должно быть предпочтительнее grep -q, хотя это может в принципе (как установлено по умолчанию в любой системе Ubuntu) выполнить все вышеперечисленное (если в обратный), сделайте это POSIXly и, как правило, быстрее.

Ответ уже заданный grep -q очень хорош, но немного терпение:

grep -q pattern ./infile; i=$((!$?))
5
ответ дан 23 May 2018 в 19:56

Вы можете использовать это:

#!/bin/bash
while IFS= read -r line; do
    case "$line" in *::=BEGIN*) i=1 && break;;         
                               *) i=0
    esac
done <file.txt

Это будет искать файл file.txt по строке, и если совпадение ::=BEGIN обнаружит, что оно установит переменную i=1 и выйдет. Если совпадение не найдено, переменная будет установлена ​​как i=0.

3
ответ дан 23 May 2018 в 19:56

sed (Stream EDitor) не является подходящим инструментом для такого рода вещей: вы можете просто использовать оператор bash if для соответствия вашему вводу с регулярным выражением:

#!/bin/bash

#...
input="$(< inputfile)"
[[ "$input" =~ ::=BEGIN ]] && i=1 || i=0
#...
[d2 ] input="$(< inputfile)": присваивает значение inputfile переменной $input [[ "$input" =~ ::=BEGIN ]] && i=1 || i=0: соответствует регулярному выражению ::=BEGIN по отношению к содержимому переменной $input; если есть совпадение, он присваивает 1 $i, в противном случае он присваивает 0 $i
2
ответ дан 23 May 2018 в 19:56

Моя sed версия

sed ':a;N;$!ba;s/\n/ /g' foo | sed '{/::=BEGIN/{s/.*/1/; b next}; s/.*/0/; :next}'

для сохранения в переменной i:

i=$(sed ':a;N;$!ba;s/\n/ /g' foo | sed '{/::=BEGIN/{s/.*/1/; b next}; s/.*/0/; :next}')

Пример:

$ echo "::=BEGIN" > foo
$ echo "::=BEGIN" >> foo
$ sed ':a;N;$!ba;s/\n/ /g' foo | sed '{/::=BEGIN/{s/.*/1/; b next}; s/.*/0/; :next}' 
1
$ echo "::=NOT_BEGIN" > foo
$ sed ':a;N;$!ba;s/\n/ /g' foo | sed '{/::=BEGIN/{s/.*/1/; b next}; s/.*/0/; :next}'
0
$ echo "::=BEGIN" >> foo
$ sed ':a;N;$!ba;s/\n/ /g' foo | sed '{/::=BEGIN/{s/.*/1/; b next}; s/.*/0/; :next}' 
1

Объяснение:

Если найдено ::=BEGIN, напечатайте 1 и перейдите к next Если ::=BEGIN не найден, напечатайте [ f10]
2
ответ дан 23 May 2018 в 19:56

Другие вопросы по тегам:

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