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 >_ 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 '(\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
© 2022 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.5/cmds/string-match.html