助け合いフォーラム
LinuC Lv1-101(Ver10.0)
問題ID : 34970
問題を開く
以下のコマンドの下線部に何をいれるべきか。
$ cat File | sed 's/Book/A &./___'
Fileの内容:
出力結果:
$ cat File | sed 's/Book/A &./___'
Fileの内容:
出力結果:
正解
gi
解説
ファイルや標準入力の内容を編集して表示するにはsedコマンドを利用します。
sedコマンドの書式と主なオプション・編集コマンドは以下のとおりです。
sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]
本問では「Book book BOOK」という入力文字列を与えられたsedコマンドが、「Book」「book」「BOOK」全てを対象に「A &.」の置換処理を行うことで「A Book. A book. A BOOK.」という出力結果になっています。
もしも下線部に何も指定せずsed 's/Book/A &./'(sコマンドのデフォルト動作)の場合、出力結果は「A Book. book BOOK」となります。
各行の最初に現れる「Book」のみが置換対象とされるためです。
上表より、「Book」「book」「BOOK」全てを置換対象にするには
g:全てのマッチする文字列を置換対象にする(一行内で複数回マッチできる場合に、全てのマッチを対象にする)
i :大文字と小文字を区別しない
を併用する必要があります。
したがって正解は
・gi
です。
なお、置換後文字列にある「&」は、マッチした文字列を参照し、置換結果に再利用する役割があります。
つまり「A &.」は、マッチした文字列の前に「A 」、後ろに「.」を付け加えて置換するので、
「Book」→「A Book.」
「book」→「A book.」
「BOOK」→「A BOOK.」
という置換結果が得られます。
その他の選択肢については以下のとおりです。
・g
この選択肢は実行結果が「A Book. book BOOK」になるので、誤りです。
g だけでなく、i も同時に指定する必要があります。
・y
y は文字の一括置換コマンドですので、誤りです。
使用方法は上表を確認してください。
・y,d
y は文字の一括置換コマンドであり、d は行の削除コマンドですので、誤りです。
使用方法は上表を確認してください。
sedコマンドの書式と主なオプション・編集コマンドは以下のとおりです。
sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]
本問では「Book book BOOK」という入力文字列を与えられたsedコマンドが、「Book」「book」「BOOK」全てを対象に「A &.」の置換処理を行うことで「A Book. A book. A BOOK.」という出力結果になっています。
もしも下線部に何も指定せずsed 's/Book/A &./'(sコマンドのデフォルト動作)の場合、出力結果は「A Book. book BOOK」となります。
各行の最初に現れる「Book」のみが置換対象とされるためです。
上表より、「Book」「book」「BOOK」全てを置換対象にするには
g:全てのマッチする文字列を置換対象にする(一行内で複数回マッチできる場合に、全てのマッチを対象にする)
i :大文字と小文字を区別しない
を併用する必要があります。
したがって正解は
・gi
です。
なお、置換後文字列にある「&」は、マッチした文字列を参照し、置換結果に再利用する役割があります。
つまり「A &.」は、マッチした文字列の前に「A 」、後ろに「.」を付け加えて置換するので、
「Book」→「A Book.」
「book」→「A book.」
「BOOK」→「A BOOK.」
という置換結果が得られます。
その他の選択肢については以下のとおりです。
・g
この選択肢は実行結果が「A Book. book BOOK」になるので、誤りです。
g だけでなく、i も同時に指定する必要があります。
・y
y は文字の一括置換コマンドですので、誤りです。
使用方法は上表を確認してください。
・y,d
y は文字の一括置換コマンドであり、d は行の削除コマンドですので、誤りです。
使用方法は上表を確認してください。
参考
【正規表現】
正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。
以下は主な正規表現とその使用例をまとめたものです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
例2)「test.txt」ファイルの空行を削除して出力する場合
$ sed '/^$/d' test.txt
※正規表現では「^」は行頭、「$」は行末の意味であるため、「^」と「$」の間に文字を挟まずつなげることで、文字が存在しない行(空行)を表します。
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。
以下は主な正規表現とその使用例をまとめたものです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
例2)「test.txt」ファイルの空行を削除して出力する場合
$ sed '/^$/d' test.txt
※正規表現では「^」は行頭、「$」は行末の意味であるため、「^」と「$」の間に文字を挟まずつなげることで、文字が存在しない行(空行)を表します。
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
&について
投稿日 2024/11/25
今回の解説ででてきた「&」は、どこから出てきたものでしょうか。正規表現やシェルのメタキャラクタというわけでもなさそうですし、唐突に知っている体で出されたので非常に混乱しています。そもそもこういうものが独立してあるとお覚えなければいけないものなのでしょうか。せめて正規表現なのかオプションなのかだけでも理解したいです。
この投稿に対して返信しませんか?