助け合いフォーラム

LPIC

LPIC Lv1-101(Ver5.0)
問題ID : 3576
問題を開く
grepコマンドを使用し、以下の「test.txt」ファイルのうち大文字アルファベットを含まない行を表示しなさい。

$ cat test.txt
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

正解

grep -v '[A-Z]' test.txt

解説

ファイルや標準入力から、正規表現のパターンにマッチする文字列を含む行を抽出するにはgrepコマンドを利用します。

grepコマンドの書式と主なオプションは以下のとおりです。

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


上表より、「-v」オプションを併用することで、検索パターンにマッチしなかった行を抽出します。
よって、検索パターンを大文字アルファベットを表す「[A-Z]」とすることで、大文字のアルファベットが含まない行を抽出することが出来ます。

したがって正解は
・grep -v '[A-Z]' test.txt
です。

以下は実行例です。
$ cat test.txt
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
$
$ grep -v '[A-Z]' test.txt
grep, egrep, fgrep - print lines matching a pattern

その他の選択肢については以下のとおりです。

・grep '[a-z]' test.txt
小文字アルファベットを含む行を表示しますので、誤りです。
【実行結果】
grep, egrep, fgrep - print lines matching a pattern
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

・grep '^[^a-z]' test.txt
行頭が小文字アルファベットでは無い行を表示しますので、誤りです。
【実行結果】
NAME
SYNOPSIS

・grep '^[^A-Z]' test.txt
行頭が大文字アルファベットでは無い行を表示しますので、誤りです。
【実行結果】
grep, egrep, fgrep - print lines matching a pattern
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

・grep -i '[a-z]' test.txt
小文字のアルファベット、及び大文字アルファベットを含む行を表示しますので、誤りです。
【実行結果】
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

・grep '[^A-Z]' test.txt
大文字アルファベット以外の文字(小文字アルファベットなど)を含む行を表示しますので、誤りです。
【実行結果】
grep, egrep, fgrep - print lines matching a pattern
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

参考

正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。

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


正規表現には次のような基本の概念があります。
・特殊文字
「|」や「\(エスケープ文字)」などのように特殊な意味を持つ文字のことです。

・文字クラス
「[ ]」内の文字集合のことです。

・数量詞
「*」や「+」などのように直前の文字の繰り返し回数を示す文字のことです。

・アンカー
「^」や「$」などのように文字列内での位置を示す文字のことです。

なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。

正規表現を利用する主なコマンドは以下のとおりです。

・grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
なお、「-E」オプションを併用すると拡張正規表現が使えます(egrepコマンドと同様)。

・sed
ファイルや標準入力の内容を編集して表示するコマンド

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

$ grep '[1-5]' test.txt

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

$ sed '/^#/d' test.txt

基本正規表現と拡張正規表現の違いに注意してください。grepコマンドは、-Eオプションを付けないと検索パターンを基本正規表現と判断しますので、上表の拡張正規表現が使えません。

実行例)


基本正規表現では「?, +」は「\?, \+」とすることで、拡張正規表現と同様の意味を持つようになります。

上に戻る

grep '[^A-Z]' test.txt も正解になるべきなので社

公開日 2022/07/24

大文字アルファベット以外の文字(小文字アルファベットなど)を含む行を表示しますので、誤りです。

大文字アルファベットを含まない行を表示しなさい。

一緒じゃないの??

2022/07/25 02:47

一緒ではないですね〜
「大文字アルファベット以外の文字(小文字アルファベットなど)を含む行を表示する」は、
大文字アルファベットが含まれていたとしても小文字アルファベットや記号、数字を含む行を抽出してしまうので、解説にある通り「grep [options] PATTERN [FILE...]」とかが引っかかっちゃいます。

「大文字アルファベットを含まない行」は↑の行を抽出したくないので、ダメってことになります。


コメント

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

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