# 第三章 GNUとUnixのコマンド
練習問題3.7
テキストファイルlinuc.txtに含まれるすべての「linic」という文字列を「LinuC」に変更し、linuc2.txtファイルとして保存したい場合に実行すべきコマンドを選択してください。
A. sed s/linuc/LinuC/f linuc.txt > linuc2.txt
B. tr s/linuc/LinuC/f linuc2.txt
C. sed -f /linuc/LinuC/ linuc.txt > linuc2.txt
D. grep linuc LinuC linuc2.txt
E. sed s/linuc/LinuC/g linuc.txt > linuc2.txt
(解答)E
(解説)指定したすべての文字列を置換するsedコマンドの書式は「sed s/文字列1/文字列2/gですので、正解は選択肢Eです。選択肢Aは「~/g」ではなく「~/f」となっているので書式誤りであり、不正解です。選択肢Bはtrコマンドの書式が誤っているので不正解です。sedの-fオプションは、指定したファイル中のコマンドを実行するオプションなので、選択肢Cは不正解です。grepは、指定された文字列パターンにマッチする行を抜き出すコマンドなので、選択肢Dは不正解です。
sedコマンド
sed(stream editor)は、テキストストリームに対して編集を行います。sedでは、編集する内容をコマンドやスクリプトとしてsedに指示しておき、sedはその指示に基づいてストリームの編集を行なって、標準出力に編集結果を書き出します。
書式 sed [オプション] コマンド [ファイル]
書式 sed [オプション] -e コマンド1 [-e コマンド2...] [ファイル]
書式 sed [オプション] -f スクリプト [ファイル]
sedコマンドの主なオプション
- -f ファイル
コマンドが書かれたスクリプトファイルを指定する - -i
処理した内容でファイルを上書きする
sedコマンドで指定できる主なコマンド
- d
マッチした行を削除する - s
パターンに基づいて置換する。gスイッチを使うと、マッチ箇所全てを置換する - y
文字を変換する
trコマンド
書式 tr [オプション] [文字列1 [文字列2]]
grepコマンド
grepコマンドは、ファイルやテキストストリームの中に、正規表現によって表される検索文字列があるかどうかを調べます。引数にファイルを指定した場合、そのファイルの中で検索パターンにマッチした文字列が含まれる行をすべて表示します。ファイルは複数指定することができます。
書式 grep [オプション] 検索パターン [ファイル名]
書式 grep [オプション] [-f ファイル名] [ファイル名]
(わからない単語解説)
- ^
主に正規表現内で文字列の開始を意味する - 正規表現
正規表現(Regular Expression)とは、特定の条件を表す文字列を抽象的に表現したもの。正規表現はファイル検索をはじめ、さまざまな場所で利用されています。検索をする場合、特定の文字列と完全に一致するものを検索することは簡単です。しかし、次のようなものを探したい場合はどうでしょうか。
「a」で始まる5文字列で、2文字目に「3」「5」「7」のいずれが含まれる。
行末の文字が「;」である
行頭は数字で始まり、行末はアルファベットの小文字である
こうした文字列を検索するには、検索する文字列の条件を正確に表現する必要があります。そのための表記法が正規表現です。正規表現を使うと、上記の文字列は次のように表すことができます。
a[357]
;$
^[0-9].*[a-z]$
- 任意の1文字
任意の1文字を表すには、「.(ピリオド)」を使います。「a..d」は「abcd」や「a12d」などを表します。 - 文字クラス
一連の文字集合を表すには「[」と「]」で括ります。これが文字クラスです。例えば、[123]は「1」「2」「3」のいずれか1文字を表します。またc[au]tは「cat」または「cut」を表します。「-」を使って範囲を指定することもできます。a[5-7]bは「a5b」「a6b」「a7b」のいずれかを表します。[0-9]は数字を、[a-z]はアルファベットの小文字を、[A-Z]はアルファベットの大文字を表します。[a-zA-Z]と書くと、大文字小文字を問わずアルファベット1文字を意味します。「^(ハット)」が先頭に置かれている場合は「〜以外」を表します。つまり、[^abc]は「aでもbでもcでもない1文字」という意味になります。 - 行頭と行末
「^」は行頭を、「$」は行末を意味します。^a「行頭にあるa」を意味します。a$は「行末にあるa」を表します。^$は「行頭と行末の間に何もないもの」を表します。つまり、空白行(改行のみ)を意味しています。
主な正規表現
- .
任意の一文字 - *
直前の文字の0回以上の繰り返し - [ ]
内の文字位のいずれか1文字 - ^
行頭 - $
行末 - <br>次に来る文字をメタキャラクタではなく通常の文字として処理する。