【技術記事】grepとsedコマンドで文字列を検索/置換する

みなさん、こんにちは、
みむすたーです。

ターミナル上でコマンドを実行した時に出力された文字列の中から、
文字列の検索や置換を行いたいということは、多々あると思います。

そんなお悩みの声を解決するべく、
本記事では、grepとsedの2つのコマンドについてご紹介したいと思います。

もくじ

名前の由来と概要

grepコマンド

Global Regular Expression Printの略です。

grepコマンドは、文字列のフィルターです。
文字の羅列が入力されたとき、条件にあった文字列のみをピックアップして、出力するものです。

例えば、abc123という文字の羅列があり、
数字のみをピックアップする”数字フィルター”と、
英字のみをピックアップする”英字フィルター”があったとき、以下のように機能します。
abc123 → 数字フィルター → 123 (abcが除外される)
abc123 → 英字フィルター → abc (123が除外される)

sedコマンド

String EDitorの略です。

sedコマンドは、文字列のコンバーターです。
文字の羅列が入力されたとき、条件にあった文字列のみに変換をかけて、出力するものです。

例えば、abc123という文字の羅列があり、
数字のみを * (アスタリスク)に変換する”数字コンバーター”と、
英字のみを * (アスタリスク)に変換する”英字コンバーター”があったとき、以下のように機能します。

abc123 → 数字コンバーター → abc*** (123を***に変換した)
abc123 → 英字コンバーター → ***123 (abcを***に変換した)

grepコマンドの使い方

単純な文字検索

一番基本的な使い方としては、-eオプションをつける検索方法です。
-eは、-regexpの省略形です。
-eオプションをつけた場合は、以下のように使います。

例えば、以下の文字列が書かれたファイル test.txt の中から、
grepコマンドで文字列の検索をかけることを考えましょう。

abcdefghijklmnopqrstuvwxyz
1234567890
Hi, mimustar.

上の文字列から abc という文字列を探す場合は、以下のように書きます。

grep -e abc test.txt

すると、以下のように出力されます。

abcdefghijklmnopqrstuvwxyz

検索の結果、一致する行が出力されます。
上の例でも、abcを含む行が抜き取れていますね。

正規表現を使った文字検索

もちろん、検索する文字列は正規表現でも書けます。
今回は、小文字の英字が存在する行を検索してみましょう。

小文字の英字を検索する場合は、[a-z]で指定します。
そして、正規表現を使用する場合は、検索文字を “(ダブルクオーテーション) で囲む必要があります。

grep -e "[a-z]" test.txt

上のコマンドを実行した結果は以下の通りとなります。

abcdefghijklmnopqrstuvwxyz
Hi, mimustar.

2行目の数字のみの行が出力されておらず、他の小文字の英字が含まれる行のみが出力されています。

sedコマンドの使い方

単純な文字の置換

こちらも基本的な使い方としては、-eオプションをつける置換方法です。
ただし、-eオプションは特に何かのオプションの省略形ではないです。

置換する文字列の指定方法は、
-eオプションの後に “s/置換前の文字/置換後の文字/g” と書きます。
sは、置換前の文字列から置換後の文字列に変換することを表し、
gは、置換前の文字列を全て検索するかどうかを表しています。

今回は、123をabcに変えてみましょう。

sed -e "s/123/abc/g" test.txt

上のコマンドを実行したとき、以下が出力されます。

abcdefghijklmnopqrstuvwxyz
abc4567890
Hi, mimustar.

123456789となっていた部分が、abc456789となっていますね。

コメント