これらのsedの例でコマンドラインのスキルを強化する方法

別の方法でテキストの編集操作を行っているのを探していましたか?もう探す必要はありません!このチュートリアルでは、ストリームエディターsedの例を提供しています。

要するに、sedを使用すると、ファイルやテキストストリームに対して幅広い編集を対話形式で行うことなく行うことができます。コマンドを呼び出す際に編集の決定を行います。そしてこのチュートリアルでは、sedコマンドの使用方法を学び、効率的にワークフローを整理する方法を身につけます。

続けて読んで、コマンドラインスキルを向上させましょう!

前提条件

このチュートリアルの実演に追従するために、以下のものが必要です:

  • A command line interface (e.g., Terminal on macOS or Linux) – This tutorial uses Ubuntu Linux 20.04, but the commands should work on most popular operating systems.
  • A text editor (e.g., nano, vi, or Sublime Text) – This tutorial uses Nano.

Ubuntuにsedをインストールする

sedは、LinuxやmacOSを含むほとんどのUnix系オペレーティングシステムに標準のユーティリティとして含まれています。しかし、sedがすでにシステムにインストールされているかどうかを再確認することは、テキスト変換を実行する前の基本的な手順であり、問題ありません。

1. ターミナルを開き、以下のsedコマンドを実行して、システムにインストールされているsedのバージョンを確認します。

sed --version

sedがインストールされている場合、以下のようにsedのバージョン番号とビルドに関する情報が表示されます。

Verifying sed’s installed version

それ以外の場合、`sed`がインストールされていない場合は、以下のエラーメッセージが表示されます。

Getting an error running sed commands

このエラーメッセージは、システムのPATH環境変数に`sed`コマンドが見つからなかったことを示しています。

次に、以下のコマンドを実行して、システムに`sed`を更新およびインストールしてください。[apt-get update]このコマンドは、構成されたパッケージソースから最新のパッケージ情報、パッケージの依存関係、ファイル、およびスクリプトを取得します。このコマンドを実行することは、`sed`の最新バージョンおよび必要な他のパッケージをインストールするために必要です。

sudo apt-get update -y && sudo apt-get install sed -y
Installing sed on the operating system

最後に、以下のコマンドを実行して`sed`コマンドがシステムにインストールされているか確認してください。

このコマンドは、この例では`/usr/bin/sed`のように`sed`実行可能ファイルの完全なパスを表示します。

一旦`sed`がインストールされ、PATHに追加されたことを確認したら、sedコマンドを使用してさまざまなテキスト変換と操作を行うことができます。

which sed
Verifying that the sed command is installed

テキストファイル内の文字列の置換

`sed`は、ほとんどのUnixライクなオペレーティングシステムで利用可能な人気のあるストリームエディタであり、その中でも`sed`の最も便利な機能の1つは、テキストファイル内の文字列を置換することです。

以下は、文字列を置換するのに役立ついくつかのシナリオですが、これに限らず様々な場面で活用できます。

  • 新しいドメイン名を反映させるためにURLのリストを更新します。
  • データベースまたはCSVファイル内の製品IDを変更します。
  • 別のシステムにインポートするためのデータをフォーマットし、その他多くの操作を行います。

sedの基本的な構文は次のとおりです:

Placeholder Function
command Controls sed’s behavior.
options Allows you to customize the behavior of the sed command
input_file Specifies the file or text stream that you want to edit. Typically, you can specify a single file or stream, but concatenating multiple files or streams by redirection also works.
output_file Specifies the file that contains the results of your sed command. The file can be new or the same as input_file, depending on how you use sed.
sed command options input_file | output_file

テキストファイル「urls.txt」があり、すべてのURLを新しいドメイン名を使用するように更新したいとします。

1. 以下のechoコマンドを実行して、現在のディレクトリにurls.txtファイルを作成します。これらのコマンドは出力を提供しませんが、指定されたテキストをファイルに書き込みます。

echo "http://old-domain.com/page1" > urls.txt && echo "http://old-domain.com/page2" >> urls.txt && echo "http://old-domain.com/page3" >> urls.txt

2. 次に、catコマンドを実行してurls.txtファイルの内容を表示します。cat urls.txt

cat urls.txt

以下の出力は、urls.txtファイルに書かれた3つの古いURLを確認しています。

Viewing the contents of the urls.txt file

3. 以下のコマンドを実行して、urls.txtファイル内の文字列old-domain.comのすべての出現箇所をnew-domain.comに置き換えます。

sed 's/old-domain.com/new-domain.com/' urls.txt

入力ファイルのURLが新しいドメインで更新されたことが確認できます。

Replacing a string in a text file

文字列のN番目の出現箇所の置換

基本的な検索と置換機能に加えて、sedにはテキストのより複雑な変換を行うための追加の組み込みコマンドがあります。その一例として、テキストの単一行内でパターン文字列のN番目の出現箇所を置き換えることがあります。

たとえば、CSVファイルの2番目のフィールドを新しい値に更新したり、データベースのダンプ内の文字列の3番目の出現箇所を更新したりしたい場合があります。

このコマンドの基本的な構文は次のとおりです:

  • pattern – 置換する文字列。
  • replacement – 置換に使用する文字列。
  • n – is the nth occurrence of the string to replace (e.g., 1=first occurrence, 2=second occurrence…).
sed 's/pattern/replacement/n' input_file

特定の文字列のn番目の出現を置換する方法を見るには、次の手順に従います:

次のechoコマンドを実行して、quickパターンが3回出現するテキスト行を作成します。次に、sedコマンドがパターンquickの2番目の出現(2)を文字列fastで置換します。

echo "The quick and quick and quick brown fox jumps over the lazy dog" | sed 's/quick/fast/2'

以下のように、パターンquickの2番目の出現のみが文字列fastで置換され、他のすべての出現は変更されません。

nthコマンドはデフォルトで大文字と小文字を区別します。そのため、コマンドはパターンの完全一致を検索します。パターンの大文字と小文字を無視するには、次の手順に進んでください。

Replacing the nth occurrence of a string

?nthコマンドは、パターンの出現を左から右に数えます。さらに、nthコマンドは、1行のテキストにのみ対応しています。複数行で置換を行うには、次のセクションで示されている異なる方法を使用します。

次に、以下のコマンドを実行して、パターンquickの2番目(2)の出現をfastで置換し、文字列の大文字と小文字を無視します(i)。

iオプションは、一貫性のない大文字と小文字のテキストを扱う際に便利です。

echo "The Quick and QuiCk and Quick brown fox jumps over the lazy dog" | sed 's/quick/fast/2i'

以下の出力では、単語「quick」の2番目の出現箇所(QuiCk)が大文字小文字を区別せずに文字列fastで置換されています。

Replacing the nth occurrence of a string while ignoring the letter case

一致するパターン/文字列のすべての出現を置換する

文字列のn番目の出現を置換する代わりに、すべての出現を置換することが計画されているかもしれません。これにより、例えば著作権文字列のすべての出現を現在の年に置換する計画に大きく役立ちます。

1.お好みのテキストエディタで、次の内容を持つinput.txtという名前のファイルを作成します。

This is a quick test.
The quick brown fox jumps over the lazy dog.
Quick, you need to finish this task before it gets too late.

2.次に、以下のコマンドを実行して、input.txtファイルから単語quickのすべての出現をfastに置換します。置換された後、変更内容はoutput.txtファイルに書き込まれます。

sed 's/quick/fast/g' input.txt > output.txt

3.次に、以下のコマンドを実行してoutput.txtファイルの内容を表示し、置換が行われたかどうかを確認します。

cat output.txt

以下のように、単語quickのすべての出現がfastに置換されていることがわかります。 nthコマンドと同様に、gコマンドは大文字小文字を区別し、完全一致のみを置換します。

Quick文字列は置換されませんが、iオプションを使用して大文字小文字を区別しない置換を行うことができます。

Replacing All the Occurrences of a Matching Pattern/String

特定の行で一致するパターン文字列を置換

おそらく、置換する文字列が含まれる行が既にわかっているかもしれません。特定の行に文字列を置換することができるなら、すべての出現箇所を置換する必要はありません。この機能は、ファイルやストリームの特定の行に変更を加える際に役立ちます。

以下は、特定の行から文字列を置換するための構文です。ここで、nは行番号を表します。

sed 'n s/pattern/replacement/' input_file output_file

1. 以下の内容を持つmyfile.txtという名前のファイルを作成します。

test1
test2
test3

2. 次に、以下のsedコマンドを実行して、以下の操作を行います。

  • myfile.txtファイルの2行目(2)から単語test2を検索します。sコマンドで単語test2test2_changedに置換します。>で変更内容をmyfile_changed.txtという新しいファイルに書き込みます。

This command does not provide output to the terminal since the changes are written to a new file. But you will verify the changes in the following step.

sed '2 s/test2/test2_changed/' myfile.txt > myfile_changed.txt

3. 最後に、以下のcatコマンドを実行して、myfile_changed.txtファイルの内容を表示します。

cat myfile_changed.txt

以下のように、myfile.txtファイルの2行目がtest2_changedに置換されていることがわかりますが、他の行は変更されていません。

Verifying the changed string on a specific line

変更された行のみを出力する

変更を加えた後、ファイル全体を出力するのではなく、変更された行のみを出力したい場合があります。どのようにすればよいでしょうか?pフラグと-nオプションを併用することで実現できます。

以下は、変更された行のみを排他的に表示するための構文です。ここで、

  • -nオプションは、sedがデフォルトの挙動であるすべての行を出力しないようにするためのものです。
  • pフラグは、sedにコマンドの出力をプリントするように指示します。
sed -n 's/pattern/replacement/p' input_file output_file

myfile.txtファイルを開き、以下の内容で置き換えてください。2行目が誤っていますが、firstという単語はsecondに置き換える必要があります。

This is the first line of my file.
This is the first line of my file.
This is the third line of my file.

次に、以下のsedコマンドを実行して、myfile.txtの2行目(2)にある文字列firstsecondに置き換えますが、変更された行のみを出力します(p)。

sed -n '2 s/first/second/p' myfile.txt

以下のように、ターミナルに変更された2行目の出力が表示されます。

Outputting changed lines exclusively

結論

このチュートリアルでは、さまざまなsedの使用例を使用して検索と置換の操作を実行しました。さらに、特定の出現回数を置換したり、変更された行のみを出力するなど、より高度な技術に触れました。

sedは、さまざまなテキスト操作タスクを実行できる強力なコマンドラインツールです。ファイル全体でのグローバルな置換や特定の行でのターゲットされた置換を行う場合でも、sedが役立ちます。

さて、正規表現についてさらに詳しく調べてみませんか?正規表現は、sedを含む多くのテキスト操作ツールに必須です。これらの表現は時間の節約になり、努力を軽減します。いつ?大量のテキストで複雑な検索と置換操作を実行するときです。

Source:
https://adamtheautomator.com/sed-examples/