はじめに
grepは文字列検索でよく使われるコマンドですが、置換と組み合わせて活用する場面も多くあります。
一方で、grep単体では置換ができないため、sedやfind、xargsなどのコマンドと組み合わせて利用することが重要です。
本記事では、基本から応用まで詳しく解説します。
参考: GNU grep
grep置換の基本構文
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apple pie
grape
pineapple
EOF
実行コマンド
grep "apple" input.txt
実行結果
apple
apple pie
pineapple
実行コマンド
grep "apple" input.txt | sed 's/apple/orange/g'
実行結果
orange
orange pie
pineorange
仕組み
| 項目 | 内容 |
|---|---|
| コマンド | grep |
| 役割 | パターンに一致する行を検索して表示する |
| 置換可否 | ×(grep単体では置換できない) |
| 置換方法 | sedやperlなどの置換コマンドと組み合わせて使用する |
解説
grepは検索専用のコマンドであり、文字列の置換機能はありません。
そのため、「grep 置換」と言われるケースでは、一般的にgrepで検索した結果をsedへ渡して置換する方法を指します。
grep置換で特定の文字列を一括置換する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apple pie
orange
apple juice
EOF
実行コマンド
grep -rl "apple" . | xargs sed -i 's/apple/orange/g'
実行結果
no output
実行コマンド
cat input.txt
実行結果
orange
banana
orange pie
orange
orange juice
仕組み
| 要素 | 説明 |
|---|---|
| grep -rl "apple" . | apple を含むファイル名を再帰的に検索する |
| xargs | 検索結果のファイル名を sed に渡す |
| sed -i | ファイルを直接編集する(インプレース編集) |
| s/apple/orange/g | apple を orange にすべて置換する |
解説
grep 自体には置換機能はありませんが、sed と組み合わせることで検索したファイルだけを効率よく一括置換できます。grep 置換ではこの組み合わせがよく利用されます。
grep置換で正規表現を使う方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
grape
pineapple
Apple
EOF
実行コマンド
grep -E 'apple|grape' input.txt
実行結果
apple
grape
pineapple
実行コマンド
grep -E '^apple$|^grape$' input.txt
実行結果
apple
grape
仕組み
| 項目 | 内容 |
|---|---|
| grep | ファイル内から条件に一致する行を検索するコマンド |
| -E | 拡張正規表現(ERE)を有効にするオプション |
| apple|grape | apple または grape に一致する(OR条件) |
| ^ | 行頭を表すアンカー |
| $ | 行末を表すアンカー |
| ^apple$ | 行全体が apple の場合のみ一致する |
解説
grepには置換機能はありませんが、正規表現を利用して柔軟な文字列検索ができます。
置換を行う場合は、一般的にsedやperlなどのコマンドと組み合わせて使用します。
grep置換でキャプチャグループを使った置換
ファイル作成
cat << 'EOF' > input.txt
name: taro
name: hanako
name: jiro
EOF
実行コマンド
grep '^name:' input.txt | sed -E 's/^name: (.*)$/user=\1/'
実行結果
user=taro
user=hanako
user=jiro
仕組み
| 項目 | 内容 |
|---|---|
| grep '^name:' | name:で始まる行のみ抽出する |
| sed -E | 拡張正規表現を有効にする |
| (.*) | name:以降の文字列をキャプチャグループとして取得する |
| \1 | 1番目のキャプチャグループを置換後の文字列へ展開する |
| s/検索/置換/ | 正規表現に一致した文字列を置換する |
解説
grepで対象行を抽出し、sedのキャプチャグループ( )と\1を利用して値を再利用しながら置換しています。
grep単体では置換できないため、sedなどの置換コマンドと組み合わせるのが一般的です。
grep置換で一致した行のみを置換する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apple pie
orange
apple juice
EOF
実行コマンド
grep 'apple' input.txt | sed 's/apple/APPLE/'
実行結果
APPLE
APPLE pie
APPLE juice
実行コマンド
sed '/apple/s/apple/APPLE/' input.txt
実行結果
APPLE
banana
APPLE pie
orange
APPLE juice
仕組み
| コマンド | 仕組み | 特徴 |
|---|---|---|
| grep 'apple' input.txt | sed 's/apple/APPLE/' | grepで一致した行だけを抽出し、その出力をsedで置換する | 一致した行のみが出力される |
| sed '/apple/s/apple/APPLE/' input.txt | appleを含む行だけsedの置換を実行する | 元の全行を保持したまま一致行のみ置換できる |
解説
grepで抽出した結果だけを置換したい場合はパイプでsedへ渡します。
元のファイル構成を維持しながら一致した行だけを置換したい場合は、sedのアドレス指定(/パターン/)を利用する方法が便利です。
grep置換で複数ファイルを一括置換する方法
ファイル作成
mkdir -p sample
ファイル作成
cat << 'EOF' > sample/file1.txt
grep is useful
Search with grep
EOF
ファイル作成
cat << 'EOF' > sample/file2.txt
Learn grep
grep is a search command
EOF
実行コマンド
grep -rl "grep" sample | xargs sed -i 's/grep/rg/g'
実行結果
no output
実行コマンド
grep -R "rg" sample
実行結果
sample/file2.txt:Learn rg
sample/file2.txt:rg is a search command
sample/file1.txt:rg is useful
sample/file1.txt:Search with rg
仕組み
| 項目 | 内容 |
|---|---|
| grep -rl "grep" sample | 「grep」を含むファイル名だけを再帰的に取得する |
| xargs | 取得したファイル名を後続のコマンドへ引き渡す |
| sed -i | ファイルを直接編集して文字列を置換する |
| s/grep/rg/g | 各行のすべての「grep」を「rg」に置換する |
解説
grepで対象ファイルを抽出し、sedで置換することで複数ファイルを一括更新できます。
対象ファイルを限定できるため、安全かつ効率的に文字列を置換できます。
grep置換で特定の拡張子のみを対象にする方法
ファイル作成
mkdir -p src docs
ファイル作成
cat << 'EOF' > src/main.py
grep foo
EOF
ファイル作成
cat << 'EOF' > src/app.py
grep bar
EOF
ファイル作成
cat << 'EOF' > src/index.js
grep baz
EOF
ファイル作成
cat << 'EOF' > src/util.py
grep hoge
EOF
ファイル作成
cat << 'EOF' > docs/readme.md
grep fuga
EOF
実行コマンド
grep -r 'grep' src/*.py docs/*.py | sed 's/grep/replace/g'
実行結果
grep: docs/*.py: No such file or directory
src/app.py:replace bar
src/main.py:replace foo
src/util.py:replace hoge
仕組み
| 項目 | 内容 |
|---|---|
| mkdir -p src docs | src と docs ディレクトリを作成する(存在していてもエラーにならない) |
| src/*.py docs/*.py | シェルのグロブで .py ファイルだけを検索対象にする |
| grep -r 'grep' | 指定した .py ファイルから grep を含む行を検索する |
| sed 's/grep/replace/g' | 抽出した行の grep を replace に置換する |
| 対象制限 | src/index.js や docs/readme.md は *.py に一致しないため検索・置換の対象にならない |
解説
*.py のグロブ指定によって、検索対象を Python ファイルだけに限定できます。
そのため、他の拡張子のファイルを意識することなく、安全に置換処理を行えます。
grep置換で除外条件を指定する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
apple pie
banana split
orange juice
grape soda
EOF
実行コマンド
grep -v "apple" input.txt | sed 's/banana/BANANA/g'
実行結果
BANANA
orange
grape
BANANA split
orange juice
grape soda
仕組み
| 項目 | 内容 |
|---|---|
| grep -v "apple" | apple を含む行を除外する(除外条件を指定) |
| sed 's/banana/BANANA/g' | 残った行だけで banana を BANANA に置換する |
| パイプ | | grep の出力を sed に渡して連続処理する |
解説
grep 自体には文字列を置換する機能はないため、除外条件の指定は grep -v、置換は sed を組み合わせて実現します。
これにより、特定の行を除外した上で安全に文字列を置換できます。
grep置換で複数条件(AND・OR)を指定する方法
ファイル作成
cat << 'EOF' > input.txt
apple red
apple green
banana yellow
banana green
orange orange
grape green
apple yellow
EOF
実行コマンド
grep -E 'apple|banana' input.txt | sed 's/apple/APPLE/g; s/banana/BANANA/g'
実行結果
APPLE red
APPLE green
BANANA yellow
BANANA green
APPLE yellow
実行コマンド
grep 'apple' input.txt | grep 'green' | sed 's/apple/APPLE/g; s/green/GREEN/g'
実行結果
APPLE GREEN
実行コマンド
grep 'apple' input.txt | grep 'yellow' | sed 's/apple/APPLE/g; s/yellow/YELLOW/g'
実行結果
APPLE YELLOW
実行コマンド
grep -E 'apple|banana' input.txt | grep 'green' | sed 's/apple/APPLE/g; s/banana/BANANA/g; s/green/GREEN/g'
実行結果
APPLE GREEN
BANANA GREEN
実行コマンド
sed -i -e 's/apple/APPLE/g' -e 's/banana/BANANA/g' input.txt
実行結果
no output
実行コマンド
cat input.txt
実行結果
APPLE red
APPLE green
BANANA yellow
BANANA green
orange orange
grape green
APPLE yellow
仕組み
| 条件 | コマンド例 | 仕組み |
|---|---|---|
| OR検索 + 置換 | grep -E 'apple|banana' input.txt | sed 's/apple/APPLE/g; s/banana/BANANA/g' | grepの-Eオプションで正規表現によるOR検索を行い、一致した行をsedで置換する。 |
| AND検索 + 置換 | grep 'apple' input.txt | grep 'green' | sed 's/apple/APPLE/g' | 複数のgrepをパイプで接続し、すべての条件に一致した行だけをsedで変更する。 |
| OR + AND検索 + 置換 | grep -E 'apple|banana' input.txt | grep 'green' | sed 's/apple/APPLE/g; s/banana/BANANA/g; s/green/GREEN/g' | OR条件で対象を絞り込み、その結果をAND条件でさらに検索してsedで置換する。 |
| ファイル直接置換 | sed -i -e 's/old/new/g' file | -iオプションにより標準出力ではなく、元ファイルへ変更内容を書き込む。 |
解説
grepは検索専用コマンドのため置換機能はありません。
検索条件をgrepで作成し、置換処理はsedへ渡すことで「grep置換」を実現できます。
grep置換でfindコマンドを組み合わせる方法
ファイル作成
mkdir -p src docs
ファイル作成
cat << 'EOF' > src/main.txt
This is a grep replacement sample.
EOF
ファイル作成
cat << 'EOF' > src/test.txt
Run grep replacement.
EOF
ファイル作成
cat << 'EOF' > docs/readme.md
Explanation of grep replacement.
EOF
実行コマンド
find . \( -path "./src/*" -o -path "./docs/*" \) -type f -exec grep -H "replacement" {} \;
実行結果
./docs/readme.md:Explanation of grep replacement.
./src/main.txt:This is a grep replacement sample.
./src/test.txt:Run grep replacement.
実行コマンド
find . \( -path "./src/*" -o -path "./docs/*" \) -type f -exec sed -i 's/replacement/search and replace/g' {} \;
実行結果
no output
実行コマンド
find . \( -path "./src/*" -o -path "./docs/*" \) -type f -exec grep -H "search and replace" {} \;
実行結果
./docs/readme.md:Explanation of grep search and replace.
./src/main.txt:This is a grep search and replace sample.
./src/test.txt:Run grep search and replace.
仕組み
| 要素 | 内容 |
|---|---|
| find . | カレントディレクトリ以下を検索する |
| -path "./src/*" -o -path "./docs/*" | srcまたはdocs配下のファイルを対象にする |
| -type f | ファイルのみを検索対象にする |
| -exec grep "replacement" {} \; | 見つかった各ファイルで文字列を検索する |
| -exec sed -i 's/replacement/search and replace/g' {} \; | 見つかった各ファイルの文字列を一括置換する |
| {} | findで見つかったファイル名が入る |
| \; | -execの終了を表す |
解説
findで対象ファイルを絞り込み、grepで検索、sedで置換することで複数ファイルを効率よく処理できます。
-execを利用すると、検索したファイルごとに任意のコマンドを実行できます。
grep置換でxargsを使って一括置換する方法
ファイル作成
cat << 'EOF' > input.txt
apple
orange
apple
grape
apple
EOF
実行コマンド
grep -rl "apple" . --include="*.txt" | xargs sed -i 's/apple/banana/g'
実行結果
no output
実行コマンド
cat input.txt
実行結果
banana
orange
banana
grape
banana
仕組み
| 要素 | 役割 |
|---|---|
| grep -rl "apple" . | appleを含むファイル名のみを再帰的に検索する |
| --include="*.txt" | 対象を.txtファイルだけに限定する |
| xargs | grepで取得したファイル一覧を後続コマンドへ渡す |
| sed -i 's/apple/banana/g' | 各ファイル内のappleをbananaへ一括置換する |
| cat input.txt | 置換後の内容を確認する |
解説
grepで置換対象のファイルだけを抽出し、その一覧をxargs経由でsedへ渡すことで効率的に一括置換できます。
大量のファイルがある環境でも不要なファイルを処理せずに済むため、高速に実行できます。
grep置換で置換結果を確認する方法(ドライラン)
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apple pie
grape
pineapple
EOF
実行コマンド
grep 'apple' input.txt
実行結果
apple
apple pie
pineapple
実行コマンド
grep 'apple' input.txt | sed 's/apple/orange/g'
実行結果
orange
orange pie
pineorange
実行コマンド
sed 's/apple/orange/g' input.txt
実行結果
orange
banana
orange pie
grape
pineorange
実行コマンド
cat input.txt
実行結果
apple
banana
apple pie
grape
pineapple
仕組み
| コマンド | 役割 | ファイル変更 |
|---|---|---|
| grep 'apple' input.txt | 置換対象となる行だけを抽出する | なし |
| grep 'apple' input.txt | sed 's/apple/orange/g' | 抽出した行に対して置換結果だけを確認する | なし |
| sed 's/apple/orange/g' input.txt | ファイル全体の置換結果を標準出力へ表示する | なし |
| cat input.txt | 元ファイルが変更されていないことを確認する | なし |
解説
grepは置換対象の行を事前に確認できるため、実際に置換する前のドライランとして活用できます。
sedを組み合わせれば、ファイルを変更せずに「grep 置換」の結果だけを安全に確認できます。
grep置換ができない場合の原因と対処法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
grape
EOF
実行コマンド
grep "apple" input.txt | sed 's/apple/orange/'
実行結果
orange
実行コマンド
grep "orange" input.txt | sed 's/orange/apple/'
実行結果
no output
実行コマンド
sed -i 's/apple/orange/' input.txt
実行結果
no output
実行コマンド
cat input.txt
実行結果
orange
banana
grape
仕組み
| 項目 | 内容 |
|---|---|
| 原因 | grepは検索専用コマンドであり、ファイルを書き換える機能(置換機能)はない。 |
| なぜ置換できないか | grepは一致した行を標準出力へ表示するだけで、入力ファイルは変更しない。 |
| 対処法 | sed 's/検索文字列/置換文字列/'で標準出力を置換する。 |
| ファイルを直接置換する方法 | sed -i 's/検索文字列/置換文字列/' ファイル名を使用する。 |
| grepの役割 | 対象文字列を検索・抽出する。 |
| sedの役割 | 文字列の置換・編集を行う。 |
解説
grepは検索専用コマンドのため、単独では文字列を置換できません。
文字列を変更したい場合は、sedやperlなどのテキスト編集コマンドと組み合わせて使用します。
grep置換をシェルスクリプトで自動化する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apple
orange
EOF
ファイル作成
cat << 'EOF' > replace.sh
#!/bin/bash
# Search with grep and replace with sed
TARGET="apple"
REPLACE="grape"
grep -n "$TARGET" input.txt
sed -i "s/$TARGET/$REPLACE/g" input.txt
echo "After replacement:"
cat input.txt
EOF
実行コマンド
chmod +x replace.sh
実行結果
no output
実行コマンド
./replace.sh
実行結果
1:apple
3:apple
After replacement:
grape
banana
grape
orange
仕組み
| 処理 | 使用コマンド | 内容 |
|---|---|---|
| 対象文字検索 | grep | ファイル内から置換対象の文字列を確認 |
| 置換処理 | sed | 指定文字列を別の文字列へ変更 |
| 自動化 | シェルスクリプト | grep検索とsed置換を一連の処理として実行 |
| 実行権限付与 | chmod | スクリプトを直接実行可能にする |
解説
grepで対象文字列を確認し、sedによる置換処理をシェルスクリプト化することで、大量ファイルへの文字列置換作業を自動化できます。
この方法を利用すると、同じ置換処理を繰り返し実行でき、作業時間の短縮や入力ミスの防止につながります。
grepの置換のポイントまとめ
grep置換は検索と置換を組み合わせた効率的な作業方法です。
基本構文を理解したうえで、正規表現や複数条件、findやxargsとの連携を覚えると、大量のファイルでも素早く編集できます。
基礎から順番に学ぶことで、初心者でも実践的なコマンド操作を身につけられます。

