ウェブサイト検索

Linuxターミナルでテキストを検索して置き換える6つの方法


設定ファイルを編集したり、大きなドキュメントを手動で各行を確認しながら更新するのは、多くの時間がかかることがあります。しかし、sed、awk、Vimなどのコマンドラインツールを使えば、検索と置換のプロセスを迅速かつ効率的に行うことができます。

sedコマンドを使用する

迅速なテキストの置換を望んでいますか? sedコマンドを使用してください。 sedを使用すると、ファイル内のテキストを検索して変更でき、単純な置換から複雑なテキスト操作まで対応できます。

例えば、example.txtという名前のファイルに「Linux」という単語が含まれていて、それを「Windows」に置き換えることにしたとします。そのためには、次のように実行します:

sed 's/Linux/Windows/g' example.txt

ここで、s フラグは置換を意味し、g フラグは sed に各行のすべてのパターンの出現を置換させることを許可します。

前のコマンドは元のファイルを直接変更するのではなく、修正された出力をターミナルに表示するだけです。ただし、元のファイルを直接操作したい場合は、-i フラグを使用してください:

sed -i 's/Linux/Windows/g' example.txt

-i フラグは、出力を表示するだけでなく、ファイル内で直接変更を行います。

変更を加える前にファイルをバックアップしますか? -i フラグに拡張子を追加してください:

sed -i.bak 's/Linux/Windows/g' example.txt

これにより、変更を加える前に example.txt.bak というバックアップファイルが作成されます。

しかし、元のファイルを変更せずにそのままにしておきたい場合は、新しいファイルを作成し、リダイレクト演算子を使って変更された出力をそこに保存することができます。

例えば、出力を別のファイルに送るには、次のようにします:

sed 's/Linux/Windows/g' example.txt > file.txt

sedを使用して複雑な正規表現パターンを使うことで、繰り返しのある大きなファイルで何を置き換えるかを制御できます。複数のインスタンスを単一のコマンドで置き換えるには、次のように実行します:

sed -i 's/Linux\|Ubuntu/Windows/g' example.txt

sedでよく使うトリックは、検索または置換の文字列にスラッシュが含まれている場合に、異なる区切り文字に切り替えることです。たとえば、ファイルパスを扱うときは、区切り文字として@記号を使うのが好きです。

sed 's@old/path@new/path@g' file.txt

これにより、コマンドが読みやすくなり、多くのエスケープ文字を使う必要がなくなります。

awkコマンドを使用してテキストを置き換える

sedのように、awkも単純から高度なテキスト操作を実行します。私はしばしばawkを使用して構造化データを処理します。特にCSVファイルにおいて、選択したフィールドでの計算が必要な場合があります。

awkは構造化データの管理でよく知られていますが、クイック検索と置換作業にも効果的です。例えば、ファイル内の特定のテキストを置換するには、次のようにできます:

awk '{gsub(/Windows/, "Linux"); print}' file.txt > new_file.txt

ここで、gsub 関数はグローバル置換を実行し、ファイルの各行において「Windows」のすべての出現箇所を「Linux」に置き換えます。awkはファイルを直接変更しないため、変更をキャッチするために出力を new_file.txt にリダイレクトします。

私はデータのエクスポートをクリーンアップするためにawkを使用します。特に、余分なフォーマットがデータ処理を複雑にするスプレッドシートからのエクスポートについてです。多くのスプレッドシートのエクスポートには、値を囲む引用符が含まれており、他のアプリケーションでのデータ処理に支障をきたすことがあります。

このコマンドを使用して、CSVファイルの最初の列からすべてのダブルクォートを削除できます。

awk -F, '{gsub(/"/, "", $1); print}' data.csv > cleaned_data.csv

ここで、gsubは最初の列からすべての二重引用符を削除し、その出力はさらに使用するためにcleaned_data.csvにリダイレクトされます。

VimのExモードでテキストを置き換える

フルエディタを開かずにクイックなテキスト変換がしたいですか?それなら、Vim(Vi Improved)を試してください。これは、コマンドラインから直接検索と置換作業を行えるExモードを持つテキストエディタです。

まず、Vimでファイルを開きます:

vim filename.txt

次に、Escキーを押してExモードに入ります。その後、(:)キーを使用します。これにより、ターミナルの下部にコロン(:)が表示され、Exモードにいることが示されます。テキストを検索して置き換えるには、次のコマンドを使用します:

:%s/macOS/Linux/g

このコマンドは、ファイル全体で「macOS」のすべての出現を「Linux」に置き換えます。%記号は、コマンドがファイル全体に適用されることを指定し、最後のgフラグは各行のすべての出現が置き換えられることを保証します。最初のものだけではなく。

各行の最初の出現のみを置き換えるには、g フラグを省略してください:

:%s/macOS/Linux/

特定の行範囲内でテキストを置き換える必要がありますか?行範囲を指定してください。例えば、3行目から10行目までのテキストを置き換えるには:

:3,10s/macOS/Linux/g

ファイルの変更を行う際に私が守っている習慣の一つは、各置き換えを確認することです。このアプローチにより、慎重に行逐的な編集が可能になります。

各置き換えのプロンプトを取得するには、コマンドの最後にcを追加してください:

:%s/macOS/Linux/gc

Bashスクリプトを使用する

時々、複数のファイルやディレクトリにわたって、一連の検索と置換操作を行う必要があるかもしれません。これらの場合、Bashスクリプトを使用することで、手動で行うには時間がかかる作業を自動化できます。

現在のディレクトリ内の複数のテキストファイルで古い文字列を新しい文字列に置き換えるシンプルなスクリプトを考えてみましょう:

#!/bin/bash
for file in *.txt; do
    sed -i 's/Windows/Linux/g' "$file"
done

このスクリプトを使用するには、まずファイルに保存します(例:bashexample.sh)。次に、次のコマンドを実行してファイルを実行可能にします:

chmod +x bashexample.sh

次に、スクリプトを実行します:

./bashexample.sh

forループは現在のディレクトリ内のすべてのテキストファイルを繰り返し、各ファイル内のテキストを置換するためにsedを使用します。また、このスクリプトを修正して、必要に応じて異なるパターンやファイルタイプを処理することもできます。

Pythonスクリプトでテキストを置き換える

Pythonの高度なテキスト処理機能を使用すると、ターミナルから直接ファイルに対して検索と置換のタスクを実行できます。Pythonスクリプトは、条件付きロジックを使って複数のファイルを処理するなど、より複雑な操作を行いたい場合に役立ちます。

まず、新しいPythonファイルを作成します。nanoやVimなどの任意のテキストエディタを使用できます。

vim textfile.py

次に、以下のPythonスクリプトをファイルに追加してください:

#!/usr/bin/env python
import sys
with open(sys.argv[1], 'r+') as f:
    content = f.read().replace('Windows', 'Linux')
    f.seek(0)
    f.write(content)
    f.truncate()

ファイルを保存した後、次のコマンドを実行して実行可能にします:

chmod +x ./testfile.py

次に、ターゲットファイルをコマンドライン引数として渡してスクリプトを実行します:

python3 ./testfile.py input.txt

このスクリプトはinput.txtの内容を読み取り、古いテキストの出現を新しいテキストに置き換え、変更をファイルに直接保存します。

trコマンドで文字のセットを置き換える

ファイル全体で特定の文字を他の文字に置き換える必要があったことはありますか?もしそうなら、trコマンドを試してみてください。このコマンドは、簡単な文字の置き換えや削除に最適です。

たとえば、私は特定の文字をテキストファイルで大文字または小文字に変換するためによく使用します。テキストファイル内のすべての小文字のaとdを大文字のAとDに置き換えるには、次のコマンドを実行します:

tr 'a,d' 'A,D' < example.txt

trは文字に対して動作し、文字列や単語に対してではないことを思い出してください。したがって、より複雑なパターンよりも単純な文字置換に最適です。

このコマンドを実行することで、空白をクリーンアップしたり、行の終了を標準化することもできます。

cat messy_file.txt | tr '\r' '\n' > clean_file.txt

これはWindowsスタイルの行末()をUnixスタイルの行末()に変換します。これは、異なるオペレーティングシステム間でファイルを扱うときに便利です。

Perlを使用して

Perlは高水準プログラミング言語であり、テキストの検索と置換を行うためにターミナルで直接使用することもできるため、sedの優れた代替手段となります。その構文はsedに似ていますが、さらに高度な機能を提供しています。

個人的に、私はPerlが特に強力な正規表現機能を持っているため、複雑な検索と置換操作に最適な選択肢だと思います。

このコマンドを使用してファイル内の任意の単語を置き換えることができます。

perl -pi -e 's/Linux/Windows/g' file.txt

ここで、-pi フラグはperlにファイルをその場で編集するように指示し、-e フラグは式を直接渡すことを可能にします。このコマンドは、file.txt内の「Linux」を「Windows」に置き換えることによって、ファイルを修正します。


単純な置換の場合、sed、awk、またはperlのようなコマンドラインツールが適しています。複数のファイルにわたって、または追加のロジックを伴うより複雑な置換を行う必要がある場合は、BashやPythonのスクリプトを選んでください。

関連記事: