書式
string length [(-q | --quiet)] [STRING...]

書式
string sub [(-s | --start) START] [(-l | --length) LENGTH] [(-q | --quiet)] [STRING...]

書式
string split [(-m | --max) MAX] [(-r | --right)] [(-q | --quiet)] SEP [STRING...]

書式
string join [(-q | --quiet)] SEP [STRING...]

書式
string trim [(-l | --left)] [(-r | --right)] [(-c | --chars CHARS)] [(-q | --quiet)] [STRING...]

書式
string escape [(-n | --no-quoted)] [STRING...]

書式
string match [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] [(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...]

書式
string replace [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] [(-q | --quiet)] PATTERN REPLACEMENT [STRING...]

概要

string コマンドは
文字列操作を行なう
ツール集です。

STRING 引数は、
標準入力がパイプかファイルに
接続されていないときは
コマンドラインから得ます。

標準入力からは、
1行につき1つの STRING
読み込みます。

コマンドラインと標準入力の
双方から文字列が与えられた場合は
エラーになります。

- から始まる引数は
通常はスイッチと解釈されます。

-- に続く引数は
たとえ - から始まるものであっても
スイッチとは解釈されません。

スイッチと
必要とされる引数は
コマンドライン上でのみ認識されます。

多くのサブコマンドは
-q / --quiet スイッチを
受け付けます。

それは出力をせずに、
説明された通りの
終了ステータス で終了するのみです。

それに加えて、
全サブコマンドは
エラー時に2を終了ステータスにします。

サブコマンド

以下のサブコマンドがあります。

length

書式
string length [(-q | --quiet)] [STRING...]

string length
各文字列引数の長さを表示します。

終了ステータスは、

  • 1つ以上の空文字列ではない文字列があるとき0
  • そうでないとき1

となります。

sub

書式
string sub [(-s | --start) START] [(-l | --length) LENGTH] [(-q | --quiet)] [STRING...]

string sub は各文字列引数の
部分文字列を表示します。

-s START / --start=START
START は部分文字列の開始(1始点)。

  • 正数であるとき、文字列の先頭から数えられる。
  • 負数であるとき、文字列の末尾から数えられる。
  • デフォルトは1。
-l LENGTH / --length=LENGTH
LENGTH は部分文字列の長さ。

  • 指定されない場合、部分文字列は各文字列の末尾まで続く。

終了ステータスは、

  • 1回以上部分文字列操作が行われたとき0
  • そうでないとき1

となります。

split

書式
string split [(-m | --max) MAX] [(-r | --right)] [(-q | --quiet)] SEP [STRING...]

string split は各文字列を
セパレータ SEP で区切ります。

その結果、
空文字列になることもあります。

-m / --max
各文字列に対して最大 MAX 回分割が行われる。
-r / --right
右から左に分割される。
-m / --max と組み合わせて使うと便利。

終了ステータスは、

  • 1回以上分割が行われたとき0
  • そうでないとき1

となります。

join

書式
string join [(-q | --quiet)] SEP [STRING...]

string join は各文字列を
SEP で区切られた
1つの文字列に結合します。

その結果、
空文字列になることもあります。

終了ステータスは、

  • 1回以上結合が行われたとき0
  • そうでないとき1

となります。

trim

書式
string trim [(-l | --left)] [(-r | --right)] [(-c | --chars CHARS)] [(-q | --quiet)] [STRING...]

string trim
各文字列から
先頭と末尾のホワイトスペースを
除去します。

-l / --left
先頭のホワイトスペースのみを除去。
-r / --right
末尾のホワイトスペースのみを除去。
-c CHARS / --chars=CHARS
ホワイトスペースの代わりに CHARS 内の文字を除去。

終了ステータスは、

  • 1回以上除去が行われたとき0
  • そうでないとき1

となります。

escape

書式
string escape [(-n | --no-quoted)] [STRING...]

string escape は各文字列を、
評価されると元の文字列になるように
エスケープします。

デフォルトでは、
すべての特別文字がエスケープされ、
可能ならば出力を簡略化するために
クオートされます。

-n / --no-quoted
クオートによる簡略化は行われない。

終了ステータスは、

  • 1回以上エスケープが行われたとき0
  • そうでないとき1

となります。

match

書式
string match [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] [(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...]

string match
各文字列を PATTERN をマッチさせ、
マッチした部分文字列を出力します

デフォルトでは
各文字列の最初のマッチが
表示されます。

デフォルトでは、
各文字列全体に対して
PATTERNグロブパターン
と解釈されます。

グロブパターンは、
文字列全体にマッチさせます。

-a / --all
全てのマッチを表示。
-i / --ignore-case
大文字小文字を区別しない。
-n / --index
各マッチに対する1始点の開始位置と長さを表示
-r / --regex
PATTERN はPerl互換の正規表現。

  • 部分文字列に正規表現がマッチすればよい。
  • グルーピングが含まれる正規表現マッチにおいては、
    各マッチにおいて複数個出力される。
    • ひとつは全体に対するマッチ。
    • 他は各グループに対するマッチ。

-v / --invert :: グロブや正規表現にマッチしない行が出力される

終了ステータスは、

  • 1回以上マッチに成功したとき0
  • そうでないとき1

となります。

replace

書式
string replace [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] [(-q | --quiet)] PATTERN REPLACEMENT [STRING...]

string replace
string match に似ていますが、

かぶらない範囲で
マッチした文字列を
REPLACEMENT に置換した結果を
出力します。

デフォルトでは、=PATTERN= は
部分文字列リテラルとして扱われます。

-r / --regex
PATTERN はPerl互換の正規表現。
REPLACEMENT は以下が含められる。

  • C言語形式のエスケープシーケンス(\t など)
  • 番号や名前によるグルーピングへの参照( $n${n} )

終了ステータスは、

  • 1回以上置換が行われたとき0
  • そうでないとき1

となります。

正規表現

string match
string replace
-r / --regex スイッチを付けることで
正規表現をサポートします。

正規表現エンジンは
PCRE2を使っています。

一般に特別文字は
デフォルトで特別です。

そのため正規表現

  • a+ は1つ以上のaにマッチ
  • a\+ はaの後の+にマッチ
  • (a+) は1つ以上のaにマッチする
    後方参照可能なグルーピング
  • (?:XXXX) は後方参照しないグルーピング

string replace
REPLACEMENT において
$N ( N は整数)は
N 番目のグループにマッチします。

PATTERN で =
= (たとえば \1 )は後方参照です。

実行例

基本的な例

$ string length 'hello, world'
12

$ set str foo
# string length -qとtest -nは同じ
$ string length -q $str; echo $status
0
$ test -n $str; echo $status
0

$ string sub --length 2 abcde
ab

$ string sub -s 2 -l 2 abcde
bc

$ string sub --start=-2 abcde
de

$ string split . example.com
example
com

$ string split -r -m1 / /usr/local/bin/fish
/usr/local/bin
fish

$ string split '' abc
a
b
c

$ seq 3 | string join ...
1...2...3

$ string trim ' abc  '
abc

$ string trim --right --chars=yz xyzzy zany
x
zan

$ echo \x07 | string escape
\cg

グロブマッチの例

$ string match '?' a
a

$ string match 'a*b' axxb
axxb

$ string match -i 'a??B' Axxb
Axxb

$ echo 'ok?' | string match '*\?'
ok?

正規表現マッチの例

$ 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

単純文字列置換の例

$ 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

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。