【正規表現とテキストストリームの加工・検索】

      このHPは正規表現とテキストストリームの加工・検索についてまとめたものです。



1-1 正規表現

正規表現とは、特定の条件を表す文字列を抽象的に表現したもの。正規表現はファイル検索を始め、様々な場所で利用されている。
正規表現に使われるメタキャラクタとその例を以下の表に示す。











1-2 sedによるテキストストリームの加工

sedはテキストストリームを加工するコマンド。特定の正規表現にマッチした文字列を置換したり削除したりするために使われる。
ただし、処理結果は標準出力に出力されるので、そのままでは元のファイルに変更は加えられない。
処理結果を保存するには、リダイレクト等を使用する。


<<書式>>
sed  【オプション】 コマンド 【ファイル名】
sed  【オプション】 -e コマンド 【-e コマンド2・・・】 【ファイル名】
sed 【オプション】  -f スクリプト  【ファイル名】

〔オプション〕
-e  コマンドを指定する
-f   コマンドが記述されたスクリプトを指定する。





■コマンド例:1
次の例では、test01内の文字列「lpic」を「LPIC」に置換している。

$ cat test01
lpic-level_1
lpic-level_2
lpic-level_3

$ sed s/lpic/LPIC/g test01
LPIC-level_1
LPIC-level_2
LPIC-level_3



■コマンド例:2
次の例では、test01内の各行の行頭に「#」を挿入している。

$ cat test01
lpic-level_1
lpic-level_2
lpic-level_3

$ sed 's/^/#/' test01
#lpic-level_1
#lpic-level_2
#lpic-level_3



■コマンド例:3
次の例では、test01ファイルの1行目から3行目までを削除している。

$ cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie

$ sed '1,3d' test01
ccna
ccnp
ccie



■コマンド例:4
次の例では、file01の「F」を「1」に、「G」を「2」に、「I」を「3」に、「H」を「4」に
置き換える。
このため、検索文字と置換文字には同じ長さを指定する必要がある。

$ cat file01
ABCDEabcdeFGHIfghi

$ sed y/FGHI/1234/ file01
ABCDEabcde1234fghi



■コマンド例:5
次の例では、scriptという名前のファイル内に記述されたコマンドを使って、test01を
処理している。

$cat test01
lpic-level_1
lpic-level_2
lpic-level_3

$ cat script
s/lpic/LPIC/g

$ sed -f script test01
LPIC-level_1
LPIC-level_2
LPIC-level_3






1-3 grepによるファイル検索

grepは、テキストストリーム内から、正規表現で指定した検索パターンにマッチした文字列が含まれる行を表示するコマンド。
grepでは、検索対象として複数のファイルを指定することもできる。


<<書式>>
grep 【オプション】 検索パターン 【ファイル名】




■コマンド例:1

以下の例では、test01とtest02の中から「lpic」という文字が含まれる行を表示している。

$cat test01
lpic-level_1
lpic-level_2

$cat test02
lpic-level_3

$grep lpic test01 test02
test01:lpic-level_1
test01:lpic-level_2
test02:lpic-level_3



■コマンド例:2

以下の例ではtest01の中から、行頭が「l」以外の行以外を表示している。

$cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie

$ grep -v ^l test01
ccna
ccnp
ccie



■コマンド例:3

以下の例ではtest01の中から、行頭が「l」の行数を表示している。

$cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie

$ grep -c ^l test01
3



◆複数の文字列の検索

複数の文字が「-」で始まる文字列を検索しようとすると、オプション指定とぶつかる。
この様な場合は、「-e」オプションを使うと正しく検索できる。また、このオプションを
使うと、複数の文字列を検索することができる。


$cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-platinum

$grep -e -level test01”-level”のある行を表示
lpic-level1
lpic-level2
lpic-level3
----------------------------------------------
$cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-platinum


$grep -e -level -e -master test01 ←”-level”または”-master”のある行を表示
lpic-level1
lpic-level2
lpic-level3
oracle-master-silver
oracle-master-gold
oracle-master-platinum



◆複数の文字列のファイル指定

毎回、同じ複数の文字列検索する時は、検索文字列をファイルで指定すると便利。
これには「-f」オプションを使用する。


$cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-platinum

$cat kensaku検索する文字列をこのファイルに記載
lpic
oracle

$grep -f kensaku test01  
lpic-level_1
lpic-level_2
lpic-level_3
oracle-master-silver
oracle-master-gold
oracle-master-platinum




◆正規表現を使用しての検索

コマンドラインで正規表現を使うとき、「*」や「/」等の文字(シェルのメタキャラクタ)を使うと、シェルで展開されてしまう。
これを防ぐには””や''で囲む。また空白文字を指定するときも””で囲む。





★行頭が「a」「b」「c」のどれかである行を表示

$cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-platinum

$ grep "^[abc]" test01
ccna
ccnp
ccie



★行末が英字である行を表示

$cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-platinum

$grep "[a-zA-Z]$" test01 ←行末が英字である行を表示
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-platinum



★空白行を除外して表示

$cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie

               ←空白行
oracle-master-silver
oracle-master-gold
oracle-master-platinum



$grep -v ^$ test01
lpic-level1
lpic-level2
lpic-level3
ccna
ccnp
ccie
oracle-master-silver 空白行が除外されている
oracle-master-gold
oracle-master-platinum