Spec-Zone.ru › Fish 3.7

string-match - сопоставление подстрок

Синтаксис

string match [-a | --all] [-e | --entire] [-i | --ignore-case]
             [-g | --groups-only] [-r | --regex] [-n | --index]
             [-q | --quiet] [-v | --invert]
             PATTERN [STRING ...]

Описание

string match проверяет каждое СТРОКУ на соответствие ШАБЛОНУ и выводит совпадающие подстроки. Только первое совпадение для каждой СТРОКИ отображается, если не указаны -a или --all, в этом случае отображаются все совпадения.

Если вы укажете -e или --entire, то каждая совпадающая строка выводится, включая любой префикс или суффикс, не соответствующий шаблону (эквивалентно grep без флага -o). Вы, очевидно, можете добиться того же результата, добавив * или .* в начало и конец ШАБЛОНА в зависимости от того, указан ли флаг --regex. Флаг --entire просто помогает избежать усложнения шаблона и сделать намерение string match более понятным. Без --entire и --regex, ШАБЛОН должен соответствовать всей СТРОКЕ, чтобы он был отображен.

Сопоставление может быть сделано без учета регистра с помощью --ignore-case или -i.

Если задан --groups-only или -g, будут отображаться только группы захвата — полный совпадение будет пропущено. Это несовместимо с --entire и --invert и требует --regex. Это полезно в качестве простого инструмента для выделения, вместо string replace, так что вы можете просто выбрать «эту часть» строки.

Если задан --index или -n, каждое совпадение отображается как начальная позиция (с 1) и длина. По умолчанию, ШАБЛОН интерпретируется как шаблон glob, сопоставляемый с каждой аргументом СТРОКИ целиком. Шаблон glob считается допустимым совпадением только если он соответствует всей СТРОКЕ.

Если задан --regex или -r, ШАБЛОН интерпретируется как регулярное выражение, совместимое с Perl, которое не обязательно должно соответствовать всей СТРОКЕ. Для регулярного выражения, содержащего группы захвата, для каждого совпадения будут отображаться несколько элементов: один для полного совпадения и один для каждой группы захвата. При этом отображается только совпадающая часть СТРОКИ, если не задан --entire.

При сопоставлении с помощью регулярных выражений, string match автоматически устанавливает переменные для всех именованных групп захвата ((?<name>expression)). Для каждой именованной группы захвата будет создана переменная с именем группы в глобальной области видимости, и она будет установлена в значение группы захвата в первом совпавшем аргументе. Если именованная группа захвата соответствовала пустой строке, переменная будет установлена в пустую строку (как set var ""). Если она не соответствовала, переменная будет установлена в пустоту (как set var). При использовании --regex с --all, это поведение меняется. Каждая именованная переменная будет содержать список совпадений, при этом первое совпадение будет содержаться в первом элементе, второе совпадение — во втором и так далее. Если группа была пустой или не соответствовала, соответствующий элемент будет пустой строкой.

Если используется --invert или -v, выбираются только те строки, которые не соответствуют заданному шаблону glob или регулярному выражению.

Код завершения: 0, если найдено хотя бы одно совпадение, или 1 в противном случае.

Примеры

Примеры сопоставления glob

>_ string match '?' a
a

>_ string match 'a*b' axxb
axxb

>_ string match -i 'a??B' Axxb
Axxb

>_ string match -- '-*' -h foo --version bar
# To match things that look like options, we need a `--`
# to tell string its options end there.
-h
--version

>_ echo 'ok?' | string match '*\?'
ok?

# Note that only the second STRING will match here.
>_ string match 'foo' 'foo1' 'foo' 'foo2'
foo

>_ string match -e 'foo' 'foo1' 'foo' 'foo2'
foo1
foo
foo2

>_ string match 'foo?' 'foo1' 'foo' 'foo2'
foo1
foo2

Примеры сопоставления регулярных выражений

>_ string match -r 'cat|dog|fish' 'nice dog'
dog

>_ string match -r -v "c.*[12]" {cat,dog}(seq 1 4)
dog1
dog2
cat3
dog3
cat4
dog4

>_ string match -r -- '-.*' -h foo --version bar
# To match things that look like options, we need a `--`
# to tell string its options end there.
-h
--version

>_ string match -r '(\d\d?):(\d\d):(\d\d)' 2:34:56
2:34:56
2
34
56

>_ string match -r '^(\w{2,4})\1$' papa mud murmur
papa
pa
murmur
mur

>_ string match -r -a -n at ratatat
2 2
4 2
6 2

>_ string match -r -i '0x[0-9a-f]{1,8}' 'int magic = 0xBadC0de;'
0xBadC0de

>_ echo $version
3.1.2-1575-ga2ff32d90
>_ string match -rq '(?<major>\d+).(?<minor>\d+).(?<revision>\d+)' -- $version
>_ echo "You are using fish $major!"
You are using fish 3!

>_ string match -raq ' *(?<sentence>[^.!?]+)(?<punctuation>[.!?])?' "hello, friend. goodbye"
>_ printf "%s\n" -- $sentence
hello, friend
goodbye
>_ printf "%s\n" -- $punctuation
.

>_ string match -rq '(?<word>hello)' 'hi'
>_ count $word
0

© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.7/cmds/string-match.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API