zsh には編集子(modifiers)というのがある。
こいつを使うと、グロブ展開(ワイルドカード展開)の結果をいろいろと編集できるようになる。
簡単な例
とりあえず例を見てもらったほうが早いと思う。
# 今このディレクトリにいる
% pwd
/home/mollifier/tmp
# ファイルが2つある
% echo *
fuga.txt hoge.txt
# :a は編集子の一種で、フルパスに変換する
% echo *(:a)
/home/mollifier/tmp/fuga.txt /home/mollifier/tmp/hoge.txt
# :r も編集子の一種で、ファイルの拡張子の部分を取り除く
% echo *(:r)
fuga hoge
# 並べて書けば2つ以上使うこともできる
% echo *(:a:r)
/home/mollifier/tmp/fuga /home/mollifier/tmp/hoge
編集子(modifiers)とは
編集子(modifiers)とは、グロブ展開の結果などを編集するための記号のこと。グロブ展開以外にも変数展開、履歴展開でも同じ記号が使える。
変数展開で使う場合はこんな感じ。()
で囲うのではなく、{}
の内側に書く。
% pwd
/home/mollifier/tmp
# この変数の値を編集子で編集する
% var="list.txt"
# フルパスにする
% echo ${var:a}
/home/mollifier/tmp/list.txt
# 拡張子部分を取り除く
% echo ${var:r}
list
# 複数使う場合
% echo ${var:a:r}
/home/mollifier/tmp/list
履歴展開で使う場合はこんな感じ。履歴展開の場合はカッコで囲まずそのまま書く。
# まず履歴を貯める
% echo list.txt
list.txt
% echo !!:1:a
/home/mollifier/tmp/list.txt
% echo !!:1:a:r
/home/mollifier/tmp/list
編集子一覧
編集子として使える記号の一覧はは以下。
記号 | 意味 |
---|---|
a | フルパスにする |
A | aと同じ。ただしシンボリックリンクを実際のパスに置き換える |
e | 拡張子だけを残す(.とそれより左を削除する) |
r | 拡張子の部分を取り除く(root) |
h | ディレクトリ名の部分だけを残す(head。dirname するのと同じ) |
t | ファイル名の部分だけを残す(tail。basename するのと同じ) |
l | すべて小文字に置き換える |
u | すべて大文字に置き換える |
s/old/new/ | 最初の old を new で置換する |
gs/old/new/ | すべての old を new で置換する |
詳細は man zshexpn の「HISTORY EXPANSION」->「Modifiers」 を参照。
うまく使うと今まで echo $var | sed s/old/new/
とかしてたところがスマートに書けると思うので使ってみてください!