IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第20回 履歴機能について知ろう(2) (宮崎悟) 2020年7月

前回は、履歴機能と履歴の展開について説明しました。今回は、履歴展開の応用編について説明します。

履歴展開のおさらい

前回の履歴の展開をおさらいすると、以下のように文字列で操作を指定します。

指示子 説明
!n 履歴番号がn の履歴を表示・実行します
!-n 履歴番号がn個前の履歴を表示・実行します
!! 1つ前の履歴を表示・実行します
!string 履歴上、最近のstringで始まるコマンドを表示・実行します
!?string[?] 履歴上、最近のstringを含むコマンドを表示・実行します<br />stringの直後が改行であれば、末尾の?を省略できます。
!# これまでに打ち込んだコマンドライン全体
履歴展開の単語指示子

履歴展開では、特定の履歴をそのまま使用する形でした。履歴展開の単語指示子では、指定した履歴の一部を指定することができます。履歴指示師と単語指示子の区切りとして「:」を使用しますが、「^」「$」、「*」、「-」、「%」では省略できます。

単語指示子 説明
0 0番目の単語。通常はコマンドを表す文字列
n n 番目の単語
^ 最初の引数、つまり1番目の単語
$ 最後の引数
% ?string? 検索に一致する一番近い単語
x-y xからyまでの範囲の単語
* すべての引数、つまり0番目の単語を除く全ての単語<br />1-$とも表現できる
x* x-$ の省略形で、x番目から最後までの単語
x- x-$ に似ているが、最後の単語を含まない
-y 0-y の省略形

以下は単語指示子の例です。

$ echo a b c d e f g
a b c d e f g
$ history | tail -2
 2099  2020-06-14 20:57:04 echo a b c d e f g
 2100  2020-06-14 20:57:05 history | tail -2
# 0番目の単語を表示
$ echo !2099:0
echo echo
echo
# 2番目の単語を表示
$ echo !2099:2
echo b
b
# 最初の引数を表示
$ echo !2099:^
echo a
a
# 最後の引数を表示
~$ echo !2099:$
echo g
g
# ?string? に一致する一番近い単語(?string?で検索し得てないので表示されない)
$ echo !2099:%
echo
# !?g? を実行後に !%を表示
$ !2099
echo a b c d e f g
a b c d e f g
$ !?g?
echo a b c d e f g
a b c d e f g
$ echo !%
echo g
g
# 3~5番目の引数を表示
$ echo !2099:3-5
echo c d e
c d e
# すべての引数を表示
$ echo !2099:*
echo a b c d e f g
a b c d e f g
# x-$
$ echo !:2-$
echo b c d e f g
b c d e f g
# x-
$ echo !:2-
echo c d e f
c d e f
# -y
$ echo !:-3
echo echo c d e
echo c d e
履歴展開の修飾子

単語指示子のあとには、1個以上の修飾子を並べておくことができます。単語指示師と修飾子は、「:」で区切る必要があります。「h」「t」「r」「e」など、修飾子同士でも、「:」で区切る場合があります。

修飾子 説明
h ファイル名(ファイルのパス名から末尾に当たる部分)を取り除いたディレクトリ部のみ表示
t ファイル名のみを表示
r ファイル名の末尾にあるサフィクス(.xxxの部分)を取り除いた、ベース名を表示
e 末尾のサフィクスのみ表示
p 新しいコマンドの表示のみを行う
s/old/new/ 文字列中の oldnew に置き換える<br />「/」の代わりに任意の文字列を使用することができる<br />new に「&」が含まれていれば、「&」を old に置き換える<br />「\&」とすれば、& 自体とみなされる<br />old が空文字列であれば、前回の履歴置換のoldが使用される<br />前回履歴置換が行われていなければ、!?string[?] の検索で使用されたstringが使用される
& 直前の置換を繰り返す
g sとともに使用され、文字列の変更をイベント全体に繰り返す
G Gsとすると、s修飾子をイベント行Sの各単語に1回ずつ適用する
q 置換が行われた単語をクォートし、それ以上の置換が行われないようにする
x qと同じだが、空白と改行文字を単語に分割する

以下は履歴展開の例です。

$ ls /usr/lib/python3/dist-packages/pip/_internal/main.py
# ファイル名のディレクトリ部のみ表示
$ echo !ls$:h
echo /usr/lib/python3/dist-packages/pip/_internal
/usr/lib/python3/dist-packages/pip/_internal
# ファイル名のみを表示
$ echo !ls$:t
echo main.py
main.py
# サフィクス抜きのファイル名を表示
$ echo !ls$:r
echo /usr/lib/python3/dist-packages/pip/_internal/main
/usr/lib/python3/dist-packages/pip/_internal/main
# サフィクスのみ表示
$ echo !ls$:e
echo .py
.py
# 表示のみ実施(サフィクスを除いたファイル名の表示という組み合わせ)
$ echo !ls$:p:t:r
echo main
# 文字列の置換(1度目しか置換されない)
!ls:s/main/cache/ !ls$
ls /usr/lib/python3/dist-packages/pip/_internal/cache.py  /usr/lib/python3/dist-packages/pip/_internal/main.py
/usr/lib/python3/dist-packages/pip/_internal/cache.py  /usr/lib/python3/dist-packages/pip/_internal/main.py
# 文字列入れ替えの繰り返し
$ echo !$:&
echo ls /usr/lib/python3/dist-packages/pip/_internal/cache.py  /usr/lib/python3/dist-packages/pip/_internal/cache.py
ls /usr/lib/python3/dist-packages/pip/_internal/cache.py /usr/lib/python3/dist-packages/pip/_internal/cache.py
# 置換の繰り返し(すべて置換される)
$ echo !ls:$ !ls:$ !ls:$
echo /usr/lib/python3/dist-packages/pip/_internal/main.py /usr/lib/python3/dist-packages/pip/_internal/main.py /usr/lib/python3/dist-packages/pip/_internal/main.py
/usr/lib/python3/dist-packages/pip/_internal/main.py /usr/lib/python3/dist-packages/pip/_internal/main.py /usr/lib/python3/dist-packages/pip/_internal/main.py
$ echo !*:gs/main/cache/
echo /usr/lib/python3/dist-packages/pip/_internal/cache.py /usr/lib/python3/dist-packages/pip/_internal/cache.py /usr/lib/python3/dist-packages/pip/_internal/cache.py
/usr/lib/python3/dist-packages/pip/_internal/cache.py /usr/lib/python3/dist-packages/pip/_internal/cache.py /usr/lib/python3/dist-packages/pip/_internal/cache.py
終わりに

今回は、履歴の展開の応用編について説明しました。次回は5月末にリリースされたWSL2について説明します。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes