string - манипулирование строками
Синопсис
string collect [(-N | --no-trim-newlines)] [STRING...] string escape [(-n | --no-quoted)] [--style=xxx] [STRING...] string join [(-q | --quiet)] SEP [STRING...] string join0 [(-q | --quiet)] [STRING...] string length [(-q | --quiet)] [STRING...] string lower [(-q | --quiet)] [STRING...] string match [(-a | --all)] [(-e | --entire)] [(-i | --ignore-case)] [(-r | --regex)] [(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...] string repeat [(-n | --count) COUNT] [(-m | --max) MAX] [(-N | --no-newline)] [(-q | --quiet)] [STRING...] string replace [(-a | --all)] [(-f | --filter)] [(-i | --ignore-case)] [(-r | --regex)] [(-q | --quiet)] PATTERN REPLACEMENT [STRING...] string split [(-m | --max) MAX] [(-n | --no-empty)] [(-q | --quiet)] [(-r | --right)] SEP [STRING...] string split0 [(-m | --max) MAX] [(-n | --no-empty)] [(-q | --quiet)] [(-r | --right)] [STRING...] string sub [(-s | --start) START] [(-l | --length) LENGTH] [(-q | --quiet)] [STRING...] string trim [(-l | --left)] [(-r | --right)] [(-c | --chars CHARS)] [(-q | --quiet)] [STRING...] string unescape [--style=xxx] [STRING...] string upper [(-q | --quiet)] [STRING...]
Описание
string выполняет операции со строками.
Аргументы STRING берутся из командной строки, если стандартный ввод не подключён к конвейеру или файлу, в противном случае они считываются со стандартного ввода, по одной строке STRING на строку. Недопустимо передавать аргументы STRING как в командной строке, так и со стандартного ввода.
Аргументы, начинающиеся с - обычно интерпретируются как переключатели; -- указывает, что последующие аргументы не должны обрабатываться как переключатели, даже если они начинаются с -. Переключатели и обязательные аргументы распознаются только в командной строке.
Большинство подкоманд принимают переключатель -q или --quiet, который подавляет обычный вывод, но завершается с документированным статусом.
Доступны следующие подкоманды.
"collect" подкоманда
string collect [(-N | --no-trim-newlines)] [STRING...]
string collect собирает свой ввод в один выходной аргумент без разделения вывода при использовании в подстановке команд. Это полезно при попытке собрать многострочный вывод другой команды в переменную. Код возврата: 0, если какой-либо выходной аргумент не пустой, или 1 в противном случае.
Если вызвана с несколькими аргументами вместо ввода, string collect сохраняет каждый аргумент отдельно, при этом количество выходных аргументов равно количеству аргументов, переданных string collect.
Любые хвостовые символы новой строки во входных данных обрезаются, точно так же, как и с подстановкой "$(cmd)" в sh. --no-trim-newlines может использоваться для отключения этого поведения, что может быть полезно при запуске команды, такой как set contents (cat filename | string collect -N).
Примеры
>_ echo \"(echo one\ntwo\nthree | string collect)\" "one two three " >_ echo \"(echo one\ntwo\nthree | string collect -N)\" "one two three"
"escape" и "unescape" подкоманды
string escape [(-n | --no-quoted)] [--style=xxx] [STRING...] string unescape [--style=xxx] [STRING...]
string escape экранирует каждую строку STRING одним из трёх способов. Первый это --style=script. Это значение по умолчанию. Оно изменяет строку таким образом, что её можно вернуть к eval для получения исходного аргумента. По умолчанию все специальные символы экранируются, а кавычки используются для упрощения вывода, когда это возможно. Если заданы -n или --no-quoted, упрощённый формат в кавычках не используется. Код возврата: 0, если по крайней мере одна строка была экранирована, или 1 в противном случае.
--style=var гарантирует, что строка может быть использована в качестве имени переменной путём кодирования любых не буквенно-цифровых символов в шестнадцатеричный код. Строка сначала преобразуется в UTF-8 перед кодированием.
--style=url гарантирует, что строка может быть использована как URL путём кодирования в шестнадцатеричный код любого символа, который не является допустимым в URL. Строка сначала преобразуется в UTF-8 перед кодированием.
--style=regex экранирует входную строку для буквального соответствия в выражении регулярного выражения. Строка сначала преобразуется в UTF-8 перед кодированием.
string unescape выполняет обратное действие команды string escape. Если строка, подлежащая экранированию, не отформатирована должным образом, она игнорируется. Например, string unescape --style=var (string escape --style=var $str) вернёт исходную строку. Поддержка экранирования --style=regex отсутствует.
Примеры
>_ echo \\x07 | string escape cg >_ string escape --style=var 'a1 b2'\\u6161 a1_20b2__c_E6_85_A1
"join" и "join0" подкоманды
string join [(-q | --quiet)] SEP [STRING...] string join0 [(-q | --quiet)] [STRING...]
string join объединяет свои аргументы STRING в одну строку, разделённые SEP, который может быть пустой строкой. Код возврата: 0, если по крайней мере одно объединение было выполнено, или 1 в противном случае.
string join0 объединяет свои аргументы STRING в одну строку, разделённые нулевым байтом (NUL), и добавляет завершающий NUL. Это наиболее полезно в сочетании с инструментами, которые принимают входные данные, ограниченные нулевым байтом, такими как sort -z. Код возврата: 0, если по крайней мере одно объединение было выполнено, или 1 в противном случае.
Примеры
>_ seq 3 | string join ... 1...2...3
"length" подкоманда
string length [(-q | --quiet)] [STRING...]
string length сообщает длину каждого аргумента строки в символах. Код возврата: 0, если задана по крайней мере одна непустая STRING, или 1 в противном случае.
Примеры
>_ string length 'hello, world' 12 >_ set str foo >_ string length -q $str; echo $status 0 # Equivalent to test -n $str
"lower" подкоманда
string lower [(-q | --quiet)] [STRING...]
string lower преобразует каждый аргумент строки в нижний регистр. Код возврата: 0, если по крайней мере одна строка была преобразована в нижний регистр, иначе 1. Это означает, что в сочетании со флагом -q вы можете легко проверить, уже ли строка в нижнем регистре.
"match" подкоманда
string match [(-a | --all)] [(-e | --entire)] [(-i | --ignore-case)] [(-r | --regex)] [(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...]
string match проверяет каждую строку STRING на соответствие PATTERN и печатает соответствующие подстроки. Только первое соответствие для каждой STRING отображается, если не заданы -a или --all, в этом случае отображаются все соответствия.
Если вы укажете -e или --entire, то каждая соответствующая строка выводится включая любой префикс или суффикс, не соответствующие шаблону (эквивалентно grep без флага -o). Вы, очевидно, можете добиться того же результата, добавив в начало и в конец * или .*, в зависимости от того, указан ли флаг --regex. Флаг --entire — это просто способ избежать необходимости усложнять шаблон таким образом и сделать намерение string match более ясным. Без --entire и --regex, шаблон PATTERN должен соответствовать всей STRING, прежде чем он будет отображён.
Сопоставление можно сделать регистронезависимым с помощью --ignore-case или -i.
Если заданы --index или -n, каждое соответствие отображается как 1-ое положение начала и длины. По умолчанию PATTERN интерпретируется как шаблон glob, сопоставленный с каждым аргументом STRING. Шаблон glob рассматривается как совпадение только в том случае, если он соответствует всей STRING.
Если заданы --regex или -r, PATTERN интерпретируется как совместимое с Perl регулярное выражение, которое не обязательно должно соответствовать всей STRING. Для регулярного выражения, содержащего группы захвата, для каждого соответствия будет отображаться несколько элементов: один для всего соответствия и один для каждой группы захвата. В этом случае будет отображаться только совпадающая часть STRING, если не задан --entire.
Если используется --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 foo 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}})\\g1$' 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
"repeat" подкоманда
string repeat [(-n | --count) COUNT] [(-m | --max) MAX] [(-N | --no-newline)] [(-q | --quiet)] [STRING...]
string repeat повторяет строку STRING -n или --count раз. Опция -m или --max ограничит количество выводимых символов (без символа новой строки). Эта опция может использоваться сама по себе или в сочетании с --count. Если оба --count и --max присутствуют, будут выведены максимальные символы, если размер конечной повторяющейся строки меньше максимума, в этом случае строка будет повторяться до тех пор, пока не будет достигнуто значение count. Оба --count и --max принимают число, большее или равное нулю. В случае нуля ничего не выводится. Если задан -N или --no-newline, вывод не будет содержать символа новой строки в конце. Код возврата: 0, если полученная строка не пуста, 1 в противном случае.
Примеры
Примеры повторения
>_ string repeat -n 2 'foo ' foo foo >_ echo foo | string repeat -n 2 foofoo >_ string repeat -n 2 -m 5 'foo' foofo >_ string repeat -m 5 'foo' foofo
"replace" подкоманда
string replace [(-a | --all)] [(-f | --filter)] [(-i | --ignore-case)] [(-r | --regex)] [(-q | --quiet)] PATTERN REPLACEMENT [STRING...]
string replace похожа на string match, но заменяет неперекрывающиеся соответствующие подстроки строкой замены и выводит результат. По умолчанию PATTERN рассматривается как буквальная подстрока для соответствия.
Если заданы -r или --regex, PATTERN интерпретируется как совместимое с Perl регулярное выражение, а REPLACEMENT может содержать последовательности C-стиля, такие как \t, а также ссылки на группы захвата по номеру или имени, как $n или ${n}.
Если вы укажете флаги -f или --filter, то каждая входная строка выводится только в том случае, если была выполнена замена. Это полезно в случаях, когда вы бы иначе использовали этот фрагмент: a_cmd | string match pattern | string replace pattern new_pattern. Вы можете вместо этого просто написать a_cmd | string replace --filter pattern new_pattern.
Код возврата: 0, если по крайней мере одна замена была выполнена, или 1 в противном случае.
Примеры замены с буквальным соответствием
>_ string replace is was 'blue is my favorite' blue was my favorite >_ string replace 3rd last 1st 2nd 3rd 1st 2nd last >_ string replace -a ' ' _ 'spaces to underscores' spaces_to_underscores
Примеры замены с регулярным выражением
>_ string replace -r -a '[^\\d.]+' ' ' '0 one two 3.14 four 5x' 0 3.14 5 >_ string replace -r '(\\w+)\\s+(\\w+)' '$2 $1 $$' 'left right' right left $ >_ string replace -r '\\s*newline\\s*' '\\n' 'put a newline here' put a here
"split" и "split0" подкоманды
string split [(-m | --max) MAX] [(-n | --no-empty)] [(-q | --quiet)] [(-r | --right)] SEP [STRING...] string split0 [(-m | --max) MAX] [(-n | --no-empty)] [(-q | --quiet)] [(-r | --right)] [STRING...]
string split разделяет каждую строку STRING по разделителю SEP, который может быть пустой строкой. Если заданы -m или --max, на каждой STRING выполняется не более MAX разделений. Если заданы -r или --right, разделение выполняется справа налево. Это полезно в сочетании с -m или --max. С -n или --no-empty, пустые результаты исключаются из рассмотрения (например, hello\n\nworld будет расширено до двух строк, а не трёх). Код возврата: 0, если по крайней мере одно разделение было выполнено, или 1 в противном случае.
См. также read --delimiter.
string split0 разделяет каждую строку STRING по нулевому байту (NUL). Опции аналогичны string split, за исключением того, что разделитель не задан.
split0 имеет важную особенность, заключающуюся в том, что её вывод не разбивается при использовании в подстановке команды, что позволяет подстановке команды производить элементы, содержащие символы новой строки. Это наиболее полезно при использовании с инструментами Unix, которые генерируют нулевые байты, такими как find -print0 или sort -z. См. примеры split0 ниже.
Примеры
>_ string split . example.com example com >_ string split -r -m1 / /usr/local/bin/fish /usr/local/bin fish >_ string split '' abc a b c
Примеры с разделителем нулевой байт
>_ # Count files in a directory, without being confused by newlines. >_ count (find . -print0 | string split0) 42 >_ # Sort a list of elements which may contain newlines >_ set foo beta alpha\\ngamma >_ set foo (string join0 $foo | sort -z | string split0) >_ string escape $foo[1] alpha\\ngamma
"sub" подкоманда
string sub [(-s | --start) START] [(-l | --length) LENGTH] [(-q | --quiet)] [STRING...]
string sub выводит подстроку каждого аргумента строки. Начало подстроки можно указать с помощью -s или --start, после чего следует значение индекса, начинающегося с 1. Положительные значения индекса относятся к началу строки, а отрицательные — к концу строки. Значение начала по умолчанию — 1. Длину подстроки можно указать с помощью -l или --length. Если длина не указана, подстрока продолжается до конца каждой STRING. Код возврата: 0, если по крайней мере одна операция подстроки была выполнена, 1 в противном случае.
Примеры
>_ string sub --length 2 abcde ab >_ string sub -s 2 -l 2 abcde bc >_ string sub --start=-2 abcde de
"trim" подкоманда
string trim [(-l | --left)] [(-r | --right)] [(-c | --chars CHARS)] [(-q | --quiet)] [STRING...]
string trim удаляет начальные и конечные пробелы из каждой STRING. Если заданы -l или --left, удаляются только начальные пробелы. Если заданы -r или --right, обрезаются только конечные пробелы. Переключатель -c или --chars вызывает удаление символов из CHARS вместо пробелов. Код возврата: 0, если по крайней мере один символ был удалён, или 1 в противном случае.
Примеры
>_ string trim ' abc ' abc >_ string trim --right --chars=yz xyzzy zany x zan
"upper" подкоманда
string upper [(-q | --quiet)] [STRING...]
string upper преобразует каждый аргумент строки в верхний регистр. Код возврата: 0, если по крайней мере одна строка была преобразована в верхний регистр, иначе 1. Это означает, что в сочетании со флагом -q вы можете легко проверить, уже ли строка в верхнем регистре.
Регулярные выражения
Оба подкоманды match и replace поддерживают регулярные выражения при использовании опции -r или --regex. Диалект — PCRE2.
В целом, специальные символы по умолчанию являются специальными, поэтому a+ соответствует одному или нескольким символам "a", а a\+ соответствует символу "a" и затем символу "+". (a+) соответствует одному или нескольким символам "a" в группе захвата ((?:XXXX) обозначает незахватывающую группу). Для параметра замены в replace символ $n относится к n-й группе совпадения. В параметре совпадения \n (например, \1) ссылается на группы.
Некоторые функции включают повторения:
-
*соответствует 0 или более повторениям предыдущего выражения -
+1 или более -
?0 или 1. -
{n}ровно n (где n — число) -
{n,m}не менее n, не более m. -
{n,}n или более
Классы символов, некоторые из наиболее важных:
-
.любой символ, кроме новой строки -
\dдесятичная цифра и\D, не десятичная цифра -
\sпробел и\S, не пробел -
\wсимвол "слова" и\W, символ "не слова" -
[...](где "..." — некоторые символы) — набор символов -
[^...]— обратный набор символов -
[x-y]— диапазон символов от x до y -
[[:xxx:]]— именованный набор символов -
[[:^xxx:]]— обратный именованный набор символов -
[[:alnum:]]: "буквенно-цифровой" -
[[:alpha:]]: "буквенный" -
[[:ascii:]]: "0-127" -
[[:blank:]]: "пробел или табуляция" -
[[:cntrl:]]: "управляющий символ" -
[[:digit:]]: "десятичная цифра" -
[[:graph:]]: "печать, исключая пробел" -
[[:lower:]]: "маленькая буква" -
[[:print:]]: "печать, включая пробел" -
[[:punct:]]: "печать, исключая буквенно-цифровой" -
[[:space:]]: "пробел" -
[[:upper:]]: "заглавная буква" -
[[:word:]]: "то же, что и w" -
[[:xdigit:]]: "шестнадцатеричная цифра"
Группы:
-
(...)— группа захвата -
(?:...)— незахватывающая группа -
\n— обратная ссылка (где n — номер группы, начиная с 1) -
$n— ссылка из выражения замены на группу в выражении совпадения.
И ещё некоторые вещи:
-
\bобозначает границу слова,\B— нет границы слова. -
^— начало строки или линии,$— конец. -
|— "альтернация", т.е. "или".
Сравнение с другими инструментами
Большинство операций, которые поддерживает string, также могут быть выполнены сторонними инструментами. Некоторые из них включают grep, sed и cut.
Если вы знакомы с ними, будет полезно узнать, чем string отличается от них.
В отличие от этих классических инструментов, string считывает ввод либо со стандартного ввода, либо в качестве аргументов. string также не работает с файлами, поэтому для работы с ними требуется перенаправление.
В отличие от grep, у string по умолчанию включен режим glob, а у replace по умолчанию используется точное соответствие. Если установлен режим regex, они используют регулярные выражения PCRE, что сопоставимо с опцией grep у -P. match по умолчанию печатает только совпадение, что похоже на grep с -o. (Используйте --entire для активации поведения `grep`).
Как и команда sed s/, string replace по-прежнему печатает строки, не соответствующие шаблону. sed -n в сочетании с модификатором или командой /p подобна string replace -f.
string split somedelimiter — замена для tr somedelimiter \\n.
© 2019 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.1/cmds/string.html