読者です 読者をやめる 読者になる 読者になる

もた日記

くだらないことを真面目にやる

ZSH-LOVERSメモ(5) : 編集子を使った便利な編集方法

ZSH-LOVERS(1)というZshのTipsを紹介しているページがあるので見てみる(続き)。
5番目はModifiersというもので編集子と訳されているらしい。詳細についてはman zshexpnに記述されている。

# NOTE: Zsh 4.3.4 needed!
  $ autoload -U age
# files modified today
  $ print *(e:age today now:)
# files modified since 5 pm
  $ print *(e-age 17:00 now-)
# ... since 5 o'clock yesterda
  $ print *(e-age yesterday,17:00 now-)
# ... from last Christmas before today
  $ print *(e-age 2006/12/25 today-)
# ... before yesterday
  $ print *(e-age 1970/01/01 yesterday-)
# all files modified between the start of those dates
  $ print *(e:age 2006/10/04 2006/10/09:)
# all files modified on that date
  $ print *(e:age 2006/10/04:)
# Supply times.
  $ print *(e-age 2006/10/04:10:15 2006/10/04:10:45-)

上記はage関数を使用した例で、本日編集したファイルなどを取得できる(これは編集子なのだろうか?)。

# Remove a trailing pathname component, leaving the head. This works like
# `dirname'.
  $ echo =ls(:h)
  /bin

:hを指定するとdirnameコマンドのようにディレクトリ名を取り出せる。
ちなみに=ls=はマニュアルによると以下のようなことらしくコマンドが存在する場合はコマンドのフルパスに置き換えられる。

`=' expansion
If a word begins with an unquoted `=' and the EQUALS option is set, the remainder of the word is taken as the name of a
command. If a command exists by that name, the word is replaced by the full pathname of the command.


# Remove all leading pathname components, leaving the tail. This works
# like `basename'.
  $ echo =ls(:t)
  ls

:tを指定するとbasenameコマンドのようにディレクトリを取り除いた情報を取り出せる。

# Remove the suffix from each file (*.sh in this example)
   $f:e is $f file extension
   :h --> head (dirname)
   :t --> tail (basename)
   :r --> rest (extension removed)
  $ for f (*.sh) mv $f $f:r

:rを指定するとファイル名から拡張子を除いた部分が取得できるので、上記のコマンドを実行すればhoge.shhogeにリネームできる。

# Remove a filename extension of the form `.xxx', leaving the root name.
  $ echo $PWD
  /usr/src/linux
  $ echo $PWD:t
  linux

(もう1回:tの例が出てきているが使い方は同じような気がする)

# Remove all but the extension.
  $ foo=23.42
  $ echo $foo
  23.42
  $ echo $foo:e
  42

:eを指定すると拡張子の部分を取得できる(上記の例は拡張子というかピリオドより後だが)。

# Print the new command but do not execute it. Only works with history
# expansion.
  $ echo =ls(:h)
  /bin
  $ !echo:p
  $ echo =ls(:h)

:pは履歴展開のみで動作し、指定するとコマンドをプリントするが実行はしない(いまいち用途がわからない)。

# Quote the substituted words, escaping further substitutions.
  $ bar="23'42"
  $ echo $bar
  23'42
  $ echo $bar:q
  23\'42

:qを指定するとエスケープする。置換文字列として指定する場合に使うのだろうか。

# Convert the words to all lowercase.
  $ bar=FOOBAR
  $ echo $bar
  FOOBAR
  $ echo $bar:l
  foobar

:lを指定すると小文字化できる。

# Convert the words to all uppercase.
  $ bar=foobar
  $ echo $bar
  foobar
  $ echo $bar:u
  FOOBAR

逆に:uを指定すると大文字化できる。

# convert 1st char of a word to uppercase
  $ foo="one two three four"
  $ print -r -- "${(C)foo}"
  One Two Three Four

なお、1文字目だけ大文字にしたい場合は(C)というParameter Expansion Flagsというものを使用するらしい。


マニュアルでは上記以外の編集子の使い方も説明されている。

a Turn a file name into an absolute path
A As 'a', but also resolve use of symbolic links where possible
c Resolve a command name into an absolute path by searching the command path given by the PATH variable
e Remove all but the part of the filename extension following the '.'
h Remove a trailing pathname component, leaving the head
l Convert the words to all lowercase
p Print the new command but do not execute it
q Quote the substituted words, escaping further substitutions
Q Remove one level of quotes from the substituted words
r Remove a filename extension leaving the root name
s/l/r[/] Substitute r for l as described below
& Repeat the previous s substitution
t Remove all leading pathname components, leaving the tail
u Convert the words to all uppercase
x Like q, but break into words at whitespace