blog

テクニック|sedコマンドによるコピー、切り取り、貼り付け

リテンションスペースはクリップボードとして使うことができます。...

Oct 7, 2025 · 6 min. read
シェア

sed、 、 ほどよく知られた Unix コマンドはほとんどなく、奇妙な名前と強力なテキスト解析機能のためか、よく一緒にまとめられています。また、構文や論理的な共通点もあります。これらはすべてテキスト解析に使えますが、それぞれ独特の性質を持っています。この記事では、.NET Frameworkの1つであるsedコマンドについて説明します。

その遠い親戚である 書きました。sedに慣れるためには、edについて少し知っておくと役立ちます。なぜなら、バッファの概念に慣れるのに役立つからです。この記事では、sed の基本的な使い方に慣れていることを前提としています。つまり、少なくとも古典的な s/foo/bar 形式の find や replace コマンドを実行したことがあるということです。

sed のインストール

Linux、BSD、またはmacOSを使用している場合、GNUまたはBSDのsedがすでにインストールされています。似てはいますが、微妙な違いがあります。この記事はLinuxとNetBSDのバージョンでテストされているので、あなたのコンピュータにあるどのsedを使ってもかまいませんが、BSDのsedではshortオプションを使う必要があります。

GNU sedは一般に最も機能が豊富なsedと考えられていますので、Linuxを動かしているかどうかにかかわらず、試してみるとよいでしょう。PortsツリーにGNU sedが見つからない場合、GNUのウェブサイトから ソースコードをダウンロードできます。 GNU sedをインストールする利点は、その追加機能を使えるだけでなく、移植性が必要な場合、sedの POSIX 仕様に準拠するように制限できることです。

MacOSユーザは sed ed GNU sedを見つけることができます。

Windowsでは、 sed GNU sedをインストールできます。

モーダル・スペースとリザーブド・スペースの理解

sedは一度に1行しか処理できません。視覚的なスキーマを持たないため、入力ストリームから現在の行を含むメモリ空間である , を作成します。パターン空間を満たした後、sed はコマンドを実行します。コマンドが終了すると、sedはパターン空間の内容を出力ストリームに出力します。デフォルトでは 標準出力ですが、出力をファイルにリダイレクトしたり、--in-place=.bakオプションで同じファイルにリダイレクトすることもできます。

ループは次の入力行から再び始まります。

ファイルをトラバースするときに少し柔軟性を持たせるために、sedは一時的なデータ保存のために確保されたsedメモリのスペースも提供します。この予約領域はクリップボードとして使うことができます。

まず、以下のような内容のサンプルテキストファイルを作成します:

  1. Line one
  2. Line three
  3. Line two

予約領域へのデータコピー

sedの保持領域にコンテンツを置くには、hまたはHコマンドを使います。小文字の h は現在の保持領域の内容を上書きするように指示し、大文字の H は既に保持領域に存在するものの後にデータを追加するように指示します。

単独では何も見えません:

  1. $ sed --quiet -e '/three/ h' example.txt

予約領域からのデータコピー

リテンション・スペースを知るには、リテンション・スペースからコンテンツをコピーし、gコマンドを使ってそれをスキーマ・スペースに入れ、何が起こるかを観察します:

  1. $ sed -n -e '/three/h' -e 'g;p' example.txt
  2. Line three
  3. Line three

最初の空白行は、sedが最初に内容をパターン・スペースにコピーしたとき、予約スペースが空だったからです。

次の2行には Line two 含まれていますが、これは2行目の予約スペースだからです。

このコマンドでは、読みやすさと整理しやすさを向上させるために、純粋に2つの独自のスクリプトを使用しています。ステップを別々のスクリプトに分割すると便利かもしれませんが、技術的には、以下のコマンドは1つのスクリプト文と同様に有効です:

  1. $ sed -n -e '/three/h ; g ; p' example.txt
  2. Line three
  3. Line three

スキーマ空間にデータを追加

Gコマンドは改行文字と予約済みスペースの内容をパターン・スペースに追加します。

  1. $ sed -n -e '/three/h' -e 'G;p' example.txt
  2. Line one
  3. Line three
  4. Line three
  5. Line two
  6. Line three

この出力の最初の2行は、パターン・スペースの内容と空の予約スペースの両方を含んでいます。次の2行は検索テキストと一致するので、パターン・スペースとリテンション・スペースの両方を含んでいます。3行目は保持スペースに変化がないので、パターン・スペースの最後の保持スペースです。

sedによる切り取りと貼り付け

これで、文字列をパターン・スペースから予約スペースに移動したり、また戻したりする方法がわかったので、行をコピーして削除し、文書に貼り付けるsedスクリプトを設計することができます。例えば、例の文書の3行目を3行目に移動するには、sedはこの問題を解決します:

  1. $ sed -n -e '/three/ h' -e '/three/ d' \
  2. -e '/two/ G;p' example.txt
  3. Line one
  4. Line two
  5. Line three
  • 最初のスクリプトは、文字列threeを含む行を見つけ、スキーマスペースから予約スペースにコピーします。
  • 2番目のスクリプトは、文字列 three を含む行をすべて削除します。これはワープロやテキストエディタでの操作に相当します。
  • 最後のスクリプトは、文字列2を含む行を見つけ、予約されたスペースの内容をパターン・スペースに_append_し、パターン・スペースを表示します。

任務完了。

sedによるスクリプティング

繰り返しますが、別々のスクリプト文を使用するのは、純粋に視覚的・精神的にシンプルにするためです。カットとペーストのコマンドは、1つのスクリプトとして同じように機能します:

  1. $ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt
  2. Line one
  3. Line two
  4. Line three

特別なスクリプトファイルに書くこともできます:

  1. #!/usr/bin/sed -nf
  2. /three/h
  3. /three/d
  4. /two/ G

スクリプトを実行するには、実行可能なパーミッションでスクリプトを追加し、サンプルファイルで試してください:

  1. $ chmod +x myscript.sed
  2. $ ./myscript.sed example.txt
  3. Line one
  4. Line two
  5. Line three

もちろん、解析するテキストが予測可能であればあるほど、sed で問題を解決するのは簡単です。アクションのトリガーとなる条件はファイルによって異なるためです。しかし、sed を使いこなせば使いこなすほど、解析すべき入力に基づいた複雑なアクションを考案するのが簡単になります。

重要なのは、さまざまな操作を認識し、セドが次の行に移るタイミングを理解し、パターンとリテンション・スペースが何を含んでいるかを予測することです。

メモシートのダウンロード

Read next