CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
前回は、履歴機能と履歴の展開について説明しました。今回は、履歴展開の応用編について説明します。
前回の履歴の展開をおさらいすると、以下のように文字列で操作を指定します。
指示子 | 説明 |
---|---|
! 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/ | 文字列中の old を new に置き換える<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