助け合いフォーラム

LPIC

LPIC Lv1-101(Ver5.0)
問題ID : 3707
問題を開く
以下の「test.txt」ファイルがある。

$ cat test.txt
CentOS

次のコマンドを実行した結果はどれか。

$ sed s/[A-Z][a-z]/-/ test.txt

正解

-ntOS

解説

sedコマンドはファイルや標準入力の内容を編集して表示するコマンドです。
設問の書式では、各行の最初に現れる文字列1を文字列2に置換します。

sed s/文字列1/文字列2/ ファイル名

正規表現[A-Z]は大文字のアルファベット1文字、[a-z]は小文字のアルファベット1文字に一致します。
つまり、「CentOS」という文字列の「アルファベットの大文字・小文字が1文字ずつ続く部分(Ce)」が、「-」に置換されることになります。

したがって正解は
・-ntOS
です。

実行例)
$ sed s/[A-Z][a-z]/-/ test.txt
-ntOS

その他の選択肢は全て誤りです。

参考

【正規表現】
正規表現とは、文字列の特定のパターンを認識するために使用する表現方法です。文字列の検索や置換などを行う際に利用します。
正規表現には基本正規表現と拡張正規表現があります。正規表現には基本正規表現と拡張正規表現があります。拡張正規表現では、特別な意味を持つ記号を基本正規表現よりも多く使用でき、複雑な検索パターンをより簡潔に記述できます。
検索パターンとは、探したい文字列の条件を表したものです。また、検索パターンの条件に当てはまることをマッチ、条件に合う行だけを取り出すことを抽出といいます。

以下は主な正規表現とその使用例をまとめたものです。


なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は、「'」(シングル・クォーテイション)や「"」(ダブル・クォーテイション)で囲めます。囲むと、正規表現の記号がシェルのメタキャラクタとして解釈されなくなります。

正規表現を利用する主なコマンドには「sed」「grep」があります。

■sed
sedは、ファイルや標準入力の内容を編集して表示するコマンドです。
書式と主なオプション・編集コマンドは以下のとおりです。sedコマンドでは、編集コマンドの「s」や「d」などを指定することで置換や削除などを行います。

sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]


例)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
 $ sed '/^#/d' test.txt

■grep
grepは、ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンドです。
書式と主なオプションは以下のとおりです。

grep [オプション] 検索パターン [ファイル名]


例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
 $ grep '[1-5]' test.txt

[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。

grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します。

例)拡張正規表現「+」を使った抽出


なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」とすることで拡張正規表現と同様の意味になります。
例)基本正規表現で「+」を扱う場合
上に戻る

正規表現を使用してのテキストファイル検索

投稿日 2025/03/10

以下の「test.txt」ファイルがある。

$ cat test.txt
CentOS

次のコマンドを実行した結果はどれか。

$ sed s/[A-Z][a-z]/-/ test.txt

シェルが [ ] を誤解釈しませんか?


t takegori

2025/03/10 16:41

問題文のコマンドこっちじゃないですか? sed 's/[A-Z][a-z]/-/' test.txt クォートないとエラー吐きませんか?

2025/03/10 17:58

私の環境ではエラー吐かなかったです。 takegori さんのところではエラーを吐いたのでしょうか?

$ grep VERSION /etc/os-release
VERSION_ID="24.04"
VERSION="24.04.2 LTS (Noble Numbat)"
VERSION_CODENAME=noble
$ cat test.txt
CentOS
$ sed s/[A-Z][a-z]/-/ test.txt
-ntOS


コメント

この返信に対して
コメントを記入できます

2025/03/12 18:38

「'」で囲む必要があるのは、シェルのメタキャラクタと正規表現のメタキャラクタが異なる意味を持っている場合です。
[]のメタキャラクタは、シェルでも正規表現ともに[]内のいずれかの1文字を意味します。
「'」があってもなくてエラーは吐きません。

たとえばメタキャラクタ「*」であれば、シェルと正規表現で意味が異なりますので、シェルのメタキャラクタとして解釈されないように「'」で囲む必要があります。
・シェル:0文字以上の文字または文字列
・正規表現:直前の文字の0回以上の繰り返し


コメント

m magousin9

2025/03/12 19:03

ちなみに、実務において、問題文の $ sed s/[A-Z][a-z]/-/ test.txt は $ sed 's/[A-Z][a-z]/-/' test.txt としたほうが好ましいらしいです。 (予期しないエラーを避けるため。)

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?