ファイル内のテキストを検索して置換する方法
1. 序章
このチュートリアルでは、組み込みのLinuxコマンドの機能を利用して、文字列をすばやく簡単に検索および置換する方法を見ていきます。 これは、多数のファイルで出現する特定の文字列をすべて更新する必要がある場合に非常に便利な手法です。
たとえば、典型的なシナリオの1つは、静的HTMLファイルのコレクションの著作権表示を更新する場合です。
2. 検索してsedに置き換えます
ここで説明する最初のコマンドは、 sed です。これは、入力ストリームで基本的な変換を実行するのに役立つ強力なストリームエディターです。 ストリームとは何かについての復習については、Linuxでのストリームリダイレクトのガイドをご覧ください。
sed を使用すると、ファイル内の文字のセットをすばやく簡単に見つけて置き換えることができます。
例で使用するテストファイルを作成することから始めましょう。 ヒアドキュメントを使用して、このテストファイルをすばやく作成します。
$ cat <<-EOF > test.txt
This is a sample file created in 2019 to demonstrate character substitution.
It will be used in 2019.
Linux has a wide array of tools for us to use to achieve this.
2019 is a leap year.
EOF
テストファイルが正常に作成されたことを確認しましょう。
$ cat test.txt
This is a sample file created in 2019 to demonstrate character substitution.
It will be used in 2019.
Linux has a wide array of tools for us to use to achieve this.
2019 is a leap year.
これですべてが正常になりました。sedの使用を開始しましょう。
2.1. 最初のオカレンスを見つけて置き換えます
sedを使用して、用語の最初の出現箇所を見つけて置き換えます。 この場合、年を現在の年に更新します。 これを実現するための構文を見てみましょう。
$ sed -i 's/{OLD_TERM}/{NEW_TERM}/' {file}
次に、このコマンドを例に適用してみましょう。
$ sed -i 's/2019/2020/' test.txt
次に、ファイルの内容を印刷して、最初に出現した「2019」:のみを置き換えたことを確認します。
$ cat test.txt
This is a sample file created in 2020 to demonstrate character substitution.
It will be used in 2019.
Linux has a wide array of tools for us to use to achieve this.
2019 is a leap year.
これがどのように機能するかをより深く理解するために、ステートメントを分解してみましょう。 まず、 -i オプションを渡して、sedにtest.txtファイル内の変更を行うように指示します。 デフォルトでは、sedは変更を端末に出力します。 次に、正規表現は何を変更するかを指定します。
- 式は文字「s」で始まり、sedは置換を実行していることを認識します。
- 次に、OLD_TERMプレースホルダーの値である文字列「2019」があります。 これは、置き換えたいテキストのセクションです
- 続いて、 NEW_TERM プレースホルダーの値があり、それが「2020」です。
- これらのパラメーターは、スラッシュ(/)を使用して区切りました。
ご覧のとおり、 sed は、検索と置換の操作をすばやく簡単に実行する方法です。
2.2. すべてのオカレンスを検索して置換
デフォルトでは、sedは最初に見つかったのみを置き換えます。 この動作を簡単にオーバーライドして、ファイル内のすべてのインスタンスを置き換えることができます。 これを実現するために使用できる式を見てみましょう。
$ sed -i 's/{OLD_TERM}/{NEW_TERM}/g' {file}
検索式の末尾に「g」を追加しました。 これは、すべてのオカレンスをグローバルに置き換えるようにsedに指示します。
それでは、これをテキストファイルに適用しましょう。
$ sed -i 's/2019/2020/g' test.txt
コマンドにさらにファイルを追加して、複数のファイルですべてのオカレンスをグローバルに置き換えることもできます。
$ sed -i 's/2019/2020/g' test.txt test2.txt test3.txt
それでは、test.txtの内容をもう一度印刷してみましょう。 今回は、「2019」のすべての出現箇所を「2020」に置き換えました。
$ cat test.txt
This is a sample file created in 2020 to demonstrate character substitution.
It will be used in 2020.
Linux has a wide array of tools for us to use to achieve this.
2020 is a leap year.
2.3. find を使用して、複数のファイルにまたがるすべてのオカレンスを検索して置換します
Linux find コマンドは、Unixベースのシステムで最も重要で一般的に使用されるコマンドラインユーティリティの1つです。 これを使用して、指定した条件に基づいてファイルまたはディレクトリのリストを検索および検索できます。 sedコマンドとfindコマンドを組み合わせて、複数のファイルのオカレンスを検索および置換してみましょう。
$ find . -name *.txt -exec sed -i 's/2020/2070/g' {} \;
このステートメントは、すべてのファイルで「2020」から「2070」のすべてのインスタンスを検索し、拡張子が.txtで置き換えます。
このステートメントを分解してみましょう:
- 。を使用して、現在の作業ディレクトリをターゲットにしました
- -name 引数を使用すると、結果を指定されたパターンに一致するファイルに制限できます。この場合、すべてのテキストファイルを取得するのは*。txtです。
- -execをfindと組み合わせて使用して、一致するファイルが見つかった後にコマンドを実行しました
- {} を使用して、sedコマンドで実行するために一致するファイルを一時的に保存しました
- \; ステートメントの最後にあるは、sedコマンドの終わりを示します
3. 検索してawkに置き換えます
このセクションでは、 awk
awkには2つの機能があります。 subおよびgsubは、置換の実行に使用できます。
サブと gsub ほとんどの部分はほとんど同じですが、
awkを使用して置換を行う方法を詳しく見てみましょう。
3.1. awkとsubの使用
awkがtest.txtサンプルファイルに対して検索と置換の操作を実行する方法を見てみましょう。
$ awk '{sub(/{OLD_TERM}/,{NEW_TERM}); print}' {file}
このステートメントでは、 awk を呼び出し、awkが実行するタスクのリストを送信しています。
これを分解してみましょう:
- リストの最初のタスクは代替であり、subと記述します。
- Subは、 awk に、 OLD_TERM のすべてのオカレンスを検索し、それらをNEW_TERMに置き換えるように指示します。
- 次の命令は、awkに出力を標準出力ストリームに出力するように指示します。 コンソール
- 最後に、awkが処理するファイルの名前があります
sed との顕著な違いは、awkがインプレース置換を実行しないことです。 これは、ファイル内で更新が行われないことを意味します。
すぐにそれに取り組みますが、今のところ、これが実際に動作しているのを見てみましょう。
$ awk '{sub(/2019/,2020); print}' test.txt
結果の出力は、交換が正しく実行されたことを確認します。
This is a sample file created in 2020 to demonstrate character substitution.
It will be used in 2020.
Linux has a wide array of tools for us to use to achieve this.
予想どおり、awkは「2019」のすべてのインスタンスを「2020」に置き換えました。
ただし、出力は元のファイルを更新するのではなく、コンソールに送信されます。 それを処理するためのトリックがあります。
ストリームとストリームリダイレクトの知識を使用してコマンドを更新し、加えられた変更が新しく指定されたファイルに保存されるようにします。
$ awk '{sub(/2019/,2020); print . "text.txt" }' > test.txt
今回はコンソールに何も出力されませんが、 test.txt の内容をダンプして、何が起こったかを確認しましょう。
$ cat test.txt
This is a sample file created in 2020 to demonstrate character substitution.
It will be used in 2020.
Linux has a wide array of tools for us to use to achieve this.
ここでは、 awk コマンドの出力が入力ファイルに正しくリダイレクトされ、それによって更新されていることがわかります。
3.2. awkとgsubの使用
構文を見てみましょう:
$ awk '{gsub(/{OLD_TERM}/,{NEW_TERM}); print}' {file}
$ awk '{gsub(/i/,"a"); print}' test.txt
結果の出力は次のとおりです。
Thas as a sample fale created an 2020 to demonstrate character substatutaon.
It wall be used an 2020.
Lanux has a wade array of tools for us to use to achaeve thas.
予想どおり、gsubは「i」のすべてのインスタンスを「a」に置き換えました。
ただし、これは結果を端末に出力するだけです。変更を保存するには、次のようにコマンドを変更できます。
$ awk '{gsub(/i/,"a"); print}' test.txt > test2.txt
コマンドの最後の変更は、 awk に、test2.txtという名前の新しいファイルを作成し、そのファイルに変更を保存するように指示します。
4. 結論
このチュートリアルでは、最も一般的な2つのLinuxユーティリティを使用して、個々のファイルを手動で編集しなくても、単一のファイルまたはファイルのセット内の文字列を検索して置換する方法について説明しました。
これらのユーティリティは非常に強力であり、Linuxコマンドラインでの作業中にさまざまな日常のタスクに役立ちます。 これらのコマンドの詳細については、これらのコマンドのドキュメントを確認してください。