助け合いフォーラム
LPIC Lv1-101(Ver5.0)
問題ID : 3668
問題を開く
ファイル名「xyz.txt」に一致するワイルドカードは次のうちどれか。(3つ選択)
正解
xy?.txt
[a-z][a-z][a-z].txt
*[xyz].txt
解説
シェルによって特別に解釈される文字をメタキャラクタといいます。
以下は主なメタキャラクタをまとめたものです。
このうち、「*」、「?」、「[ ]」など任意の文字を表す特殊文字がワイルドカードです。ファイル名などのパターンと照合する際にコマンドで使用できます。
例)「[a-z][a-z][a-z].txt」に一致するファイルを一覧表示する
$ ls [a-z][a-z][a-z].txt
選択肢を1つずつ確認します。
・a*z.txt
ファイル名がaから始まると解釈されるので表示されません。誤りです。
・xy?.txt
「xy(任意の1文字).txt」は「xyz.txt」に一致します。正しいワイルドカードです。
・[xyz].txt
「(xyzのいずれか1文字).txt」と解釈されるので表示されません。誤りです。
・[a-z][a-z][a-z].txt
aからzのいずれか1文字が3つということで「xyz.txt」に一致します。正しいワイルドカードです。
・*[xyz].txt
「(任意の文字列)(xyzのいずれか1文字).txt」で「xyz.txt」に一致します。正しいワイルドカードです。
したがって正解は
・xy?.txt
・[a-z][a-z][a-z].txt
・*[xyz].txt
です。
以下は実行例です。
以下は主なメタキャラクタをまとめたものです。
このうち、「*」、「?」、「[ ]」など任意の文字を表す特殊文字がワイルドカードです。ファイル名などのパターンと照合する際にコマンドで使用できます。
例)「[a-z][a-z][a-z].txt」に一致するファイルを一覧表示する
$ ls [a-z][a-z][a-z].txt
選択肢を1つずつ確認します。
・a*z.txt
ファイル名がaから始まると解釈されるので表示されません。誤りです。
・xy?.txt
「xy(任意の1文字).txt」は「xyz.txt」に一致します。正しいワイルドカードです。
・[xyz].txt
「(xyzのいずれか1文字).txt」と解釈されるので表示されません。誤りです。
・[a-z][a-z][a-z].txt
aからzのいずれか1文字が3つということで「xyz.txt」に一致します。正しいワイルドカードです。
・*[xyz].txt
「(任意の文字列)(xyzのいずれか1文字).txt」で「xyz.txt」に一致します。正しいワイルドカードです。
したがって正解は
・xy?.txt
・[a-z][a-z][a-z].txt
・*[xyz].txt
です。
以下は実行例です。
参考
メタキャラクタは、シェルによって特別に解釈される文字です。
以下は主なメタキャラクタとディレクトリ関連の特殊記号をまとめたものです。
例えばechoコマンドの引数に「*」を指定した場合、シェルは「*」を表示せずカレントディレクトリの内容を表示します。これは、シェルが「*」をメタキャラクタとして特別に認識するためです。
$ echo *
file1 file2
シェルがメタキャラクタを通常の文字として扱う(メタキャラクタをエスケープする)ためには、以下のような方法があります。
・「\」(環境によっては「¥」が表示される)をメタキャラクタの直前に付ける
$ echo \*
*
・「'」でメタキャラクタまたはメタキャラクタを含む文字列を囲む
$ echo '*'
*
・「"」でメタキャラクタまたはメタキャラクタを含む文字列を囲む
$ echo "*"
*
なお、「"」で囲まれた「$」、「`」、「\」、「"」は文字ではなくメタキャラクタとして扱われます。
例)
$ DATE=date
$ echo "$DATE"
date
「"」で囲まれていても「$」はメタキャラクタとして扱われるため、「$DATE」とは表示されず、変数に格納されている値が表示されます。
つまり、「echo "$DATE"」と「echo $DATE」の実行結果は同じです。
例)
$ echo "`date`"
2012年 1月 12日 木曜日 15:00:40 MST
「"」で囲まれていても「`」はメタキャラクタとして扱われるため、「`date`」とは表示されず、dateコマンド(現在の日付と時刻を表示)の実行結果が表示されます。
つまり、「echo "`date`"」と「echo `date`」の実行結果は同じです。
以下は主なメタキャラクタとディレクトリ関連の特殊記号をまとめたものです。
例えばechoコマンドの引数に「*」を指定した場合、シェルは「*」を表示せずカレントディレクトリの内容を表示します。これは、シェルが「*」をメタキャラクタとして特別に認識するためです。
$ echo *
file1 file2
シェルがメタキャラクタを通常の文字として扱う(メタキャラクタをエスケープする)ためには、以下のような方法があります。
・「\」(環境によっては「¥」が表示される)をメタキャラクタの直前に付ける
$ echo \*
*
・「'」でメタキャラクタまたはメタキャラクタを含む文字列を囲む
$ echo '*'
*
・「"」でメタキャラクタまたはメタキャラクタを含む文字列を囲む
$ echo "*"
*
なお、「"」で囲まれた「$」、「`」、「\」、「"」は文字ではなくメタキャラクタとして扱われます。
例)
$ DATE=date
$ echo "$DATE"
date
「"」で囲まれていても「$」はメタキャラクタとして扱われるため、「$DATE」とは表示されず、変数に格納されている値が表示されます。
つまり、「echo "$DATE"」と「echo $DATE」の実行結果は同じです。
例)
$ echo "`date`"
2012年 1月 12日 木曜日 15:00:40 MST
「"」で囲まれていても「`」はメタキャラクタとして扱われるため、「`date`」とは表示されず、dateコマンド(現在の日付と時刻を表示)の実行結果が表示されます。
つまり、「echo "`date`"」と「echo `date`」の実行結果は同じです。
シェルと正規表現でのメタキャラクタについて
T
Tenpa_
投稿日 2023/02/16
お世話になります。
メタキャラクタについて問う設問がありますが、
その問いがシェルにおけるメタキャラクタを指しているのか、
もしくは正規表現でのメタキャラクタを指しているのか、
どのように判断すればよいのでしょうか。
恐れ入りますが、ご教示いただけますと幸いです。
2023/02/19 21:36
正規表現を使う場面って、テキストファイル中の文字列を検索したいとか置換したい時だと思うので、
「ファイル名に合致するもの」のような設問はシェルのメタキャラクタと考えてました。
正規表現の場合は、問題文にそう書かれてたりgrepやsedで検索(置換)したい、
みたいなことが書かれてるんじゃないかなと思います。
質問の意図を読み違えてたらすみません。
コメント
この投稿に対して返信しませんか?
T Tenpa_
2023/02/19 22:32
ご回答いただきありがとうございます。 今後は使用する場面をイメージし、問題を解いていきたいと思います。