- 書式
- 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}
)
- C言語形式のエスケープシーケンス(
終了ステータスは、
- 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
最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。
サブコマンドに、
escape, unescape:記号などのエスケープ、URL形式など3種に対応
lower, upper:大文字小文字への変換
repeat:繰り返し
の操作が追加されていますね。ますます便利になっています。
こちらのfishマニュアルの日本語訳で理解しやすくてありがたいです。
ありがとう!
下記 match の説明について。
細かいのですが、「大文字小文字を区別しない。」とされる方が確実ではないでしょうか。
(現在の記載ですと、"-i を付けると 大文字と小文字を区別する" ように読めてしまう気がします)
ーーーー
-i / --ignore-case
大文字小文字を区別。
ーーーー
http://fish.rubikitch.com/string/