search
LoginSignup
52

More than 5 years have passed since last update.

posted at

zsh で編集子を使ってグロブ展開とかをその場で編集する

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/ 最初の oldnew で置換する
gs/old/new/ すべての oldnew で置換する

詳細は man zshexpn の「HISTORY EXPANSION」->「Modifiers」 を参照。

うまく使うと今まで echo $var | sed s/old/new/ とかしてたところがスマートに書けると思うので使ってみてください!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
52