Bash-тест: что делает «= ~»?

W: Дублирующаяся запись в sources.list http://....

У вас дублируется запись в source.list

Вручную :

Отредактируйте sources.list, закомментируйте или удалите дублирующуюся запись.

Через GUI :

Установите Y PPA Manager

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install y-ppa-manager

Затем выберите сканирование и удаление дубликатов PPA из дополнительных опций Y PPA Manager

44
27.01.2017, 03:06
2 ответа

~ фактически является частью оператора = ~ , который выполняет сопоставление строки с регулярным выражением слева от расширенного регулярного выражения справа.

[[ "string" =~ pattern ]]

Обратите внимание, что строка должна быть заключена в кавычки, а регулярное выражение - в кавычки.

Аналогичный оператор используется в языке программирования Perl.

Регулярные выражения, понимаемые bash , такие же, как и те, которые понимает GNU grep с флагом -E , то есть расширенным набором регулярных выражений.


Скорее не по теме, но полезно знать:

При сопоставлении с регулярным выражением, содержащим группы захвата, часть строки, захваченная каждой группой, доступна в массиве BASH_REMATCH . Нулевой / первый элемент в этом массиве соответствует & в шаблоне замены команды подстановки sed (или $ & в Perl), что является бит строки, который соответствует шаблону, в то время как записи с индексом 1 и далее соответствуют \ 1 , \ 2 и т. д. в шаблоне замены sed (или $ 1 , $ 2 и т. д. в Perl), то есть биты, соответствующие каждой круглой скобке.

Пример:

string=$( date +%T )

if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
  printf 'Got %s, %s and %s\n' \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi

Может вывести

Got 09, 19 and 14

, если текущее время 09:19:14.

Бит REMATCH имени массива BASH_REMATCH происходит от «Соответствие регулярного выражения», то есть «Повторное сопоставление».


В оболочках, отличных от bash Борна, можно также использовать expr для ограниченного сопоставления регулярных выражений (с использованием только базовых регулярных выражений).

Небольшой пример:

$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
81
27.01.2020, 19:34

Вам следует прочитать страницы руководства bash в разделе [[выражение]] .

Доступен дополнительный бинарный оператор = ~ с тем же приоритетом, что и == и! =.Когда он используется, строка справа от оператора считается расширенным регулярным выражением и соответствующим образом сопоставляется (как в regex (3)).

Короче говоря, = ~ - это оператор, как и == и ! = . Это не имеет ничего общего с фактическим регулярным выражением в строке справа.

7
27.01.2020, 19:34

Теги

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