GNU/Linux >> Linux の 問題 >  >> Linux

Linuxsedコマンドの使用方法

sed、grep、awkほど有名なUnixコマンドはほとんどありません。それらは、おそらく奇妙な名前とテキストを解析するための強力なツールを持っているために、頻繁にグループ化されます。それらはまた、いくつかの構文的および論理的な類似点を共有しています。これらはすべてテキストの解析に役立ちますが、それぞれに専門性があります。この記事では、sedについて説明します。 ストリームエディタであるコマンド 。

私は以前にsedとその遠い親戚のedについて書いたことがあります。 sedに慣れるためには、バッファの概念に慣れるためにedにある程度慣れておくと役立ちます。この記事は、sedの基本に精通していること、つまり、少なくとも従来のs/foo/bar/を実行していることを前提としています。 スタイルの検索と置換コマンド。

[無料のsedチートシートをダウンロード]

sedのインストール

その他のLinuxリソース

  • Linuxコマンドのチートシート
  • 高度なLinuxコマンドのチートシート
  • 無料のオンラインコース:RHELの技術概要
  • Linuxネットワーキングのチートシート
  • SELinuxチートシート
  • Linuxの一般的なコマンドのチートシート
  • Linuxコンテナとは何ですか?
  • 最新のLinux記事

Linux、BSD、またはmacOSを使用している場合は、GNUまたはBSDsedがすでにインストールされています。これらは、元のsedの独自の再実装です。 コマンド、およびそれらは似ていますが、マイナーな違いがあります。この記事はLinuxおよびNetBSDバージョンでテストされているため、この場合、コンピューターで見つけたsedを使用できますが、BSD sedの場合は、短いオプション(-n)を使用する必要があります。 --quietの代わりに 、たとえば)のみ。

GNU sedは、一般的に利用可能な最も機能豊富なsedであると見なされているため、Linuxを実行しているかどうかに関係なく試してみることをお勧めします。ポートツリーにGNUSed(Linux以外のシステムではgsedと呼ばれることが多い)が見つからない場合は、GNUWebサイトからソースコードをダウンロードできます。 GNU sedをインストールすることの良いところは、その追加機能を使用できるだけでなく、移植性が必要な場合は、sedのPOSIX仕様に準拠するように制約できることです。

MacOSユーザーは、MacPortsまたはHomebrewでGNUsedを見つけることができます。

Windowsでは、Chocolateyを使用してGNUsedをインストールできます。

パターンスペースとホールドスペースを理解する

Sedは一度に正確に1行で動作します。視覚的な表示がないため、パターンスペースが作成されます。 、入力ストリームからの現在の行を含むメモリ内のスペース(末尾の改行文字は削除されます)。パターンスペースにデータを入力すると、sedは命令を実行します。コマンドの最後に到達すると、sedはパターンスペースの内容を出力ストリームに出力します。デフォルトの出力ストリームはstdoutです 、ただし、--in-place=.bakを使用して、出力をファイルにリダイレクトしたり、同じファイルに戻したりすることもできます。 オプション。

その後、サイクルは次の入力行から再開されます。

sedを使用してファイルをスクラブするときに少し柔軟性を提供するために、sedはホールドスペースも提供します。 (ホールドバッファとも呼ばれます )、一時的なデータストレージ用に予約されたsedのメモリ内のスペース。ホールドスペースはクリップボードと考えることができます。実際、この記事では、sedを使用してコピー/カットアンドペーストする方法を示しています。

まず、このテキストをコンテンツとして使用してサンプルテキストファイルを作成します。

Line one
Line three
Line two
データをコピーしてスペースを保持する

sedのホールドスペースに何かを配置するには、hを使用します またはH 指図。小文字のh 大文字のHを使用して、ホールドスペースの現在の内容を上書きするようにsedに指示します。 すでに保留スペースにあるものにデータを追加するように指示します。

単独で使用すると、見るものはあまりありません:

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

--quiet-n 略して)オプションはすべての出力を抑制しますが、sedは私の検索要件に対して実行しました。この場合、sedは文字列threeを含む任意の行を選択します 、スペースを保持するためにそれをコピーします。 sedに何も印刷するように指示していないので、出力は生成されません。

保留スペースからのデータのコピー

ホールドスペースについての洞察を得るために、ホールドスペースからコンテンツをコピーし、gを使用してパターンスペースに配置できます。 指図。何が起こるかを見てください:

$ sed -n -e '/three/h' -e 'g;p' example.txt

Line three
Line three

最初の空白行は、最初にパターンスペースにコピーされたときにホールドスペースが空であるために印刷されます。

次の2行には、Line threeが含まれています それが2行目以降の保留スペースにあるからです。

このコマンドは、2つの固有のスクリプト(-e)を使用します )純粋に読みやすさと整理を支援するため。ステップを個々のスクリプトに分割すると便利な場合がありますが、技術的には、このコマンドは1つのスクリプトステートメントと同じように機能します。

$ sed -n -e '/three/h ; g ; p' example.txt

Line three
Line three
パターンスペースへのデータの追加

G コマンドは、改行文字とホールドスペースの内容をパターンスペースに追加します。

$ sed -n -e '/three/h' -e 'G;p' example.txt
Line one

Line three
Line three
Line two
Line three

この出力の最初の2行には、パターンスペースの両方の内容が含まれています(Line one )および空のホールドスペース。次の2行は、検索テキスト(three)と一致します )、したがって、パターンスペースとホールドスペースの両方が含まれます。 3番目の行のペアではホールドスペースは変更されないため、パターンスペース(Line two )ホールドスペースを使用して印刷します(Line three )最後に続く。

sedでカットアンドペーストを行う

パターンから文字列をジャグリングしてスペースを保持し、元に戻す方法がわかったので、ドキュメント内に行をコピーして削除し、貼り付けるsedスクリプトを考案できます。たとえば、この記事のサンプルファイルにはLine threeがあります 故障中。 Sedはそれを修正できます:

$ sed -n -e '/three/ h' -e '/three/ d' \
-e '/two/ G;p' example.txt
Line one
Line two
Line three
  • 最初のスクリプトは、文字列threeを含む行を検索します パターンスペースからホールドスペースにコピーし、現在ホールドスペースにあるものをすべて置き換えます。
  • 2番目のスクリプトは、文字列threeを含むすべての行を削除します 。これで、カットに相当するものが完成します。 ワードプロセッサまたはテキストエディタでのアクション。
  • 最後のスクリプトは、twoを含む行を見つけます および追加 ホールドスペースの内容をパターンスペースに変換してから、パターンスペースを印刷します。

仕事は終わりました。

sedを使用したスクリプト

繰り返しになりますが、個別のスクリプトステートメントの使用は、純粋に視覚的および精神的な単純化のためです。カットアンドペーストコマンドは1つのスクリプトとして機能します:

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

専用のスクリプトファイルとして作成することもできます:

#!/usr/bin/sed -nf

/three/h
/three/d
/two/ G
p

スクリプトを実行するには、スクリプトを実行可能としてマークし、サンプルファイルで試してください:

$ chmod +x myscript.sed
$ ./myscript.sed example.txt
Line one
Line two
Line three

もちろん、解析する必要のあるテキストが予測可能であればあるほど、sedで問題を解決するのは簡単になります。アクションをトリガーする条件はファイルごとに異なる可能性があるため、通常、sedアクション(コピーアンドペーストなど)の「レシピ」を考案することは実用的ではありません。ただし、sedのコマンドを流暢に習得すればするほど、解析する必要のある入力に基づいて複雑なアクションを考案するのが容易になります。

重要なことは、明確なアクションを認識し、sedが次の行に移動するタイミングを理解し、パターンとホールドスペースに何が含まれるかを予測することです。

チートシートをダウンロード

Sedは複雑です。コマンドは12個しかありませんが、その柔軟な構文と生のパワーは、無限の可能性に満ちていることを意味します。私はsedを最大限に活用するために、巧妙なワンライナーのページを参照していましたが、自分のソリューションを発明し始める(そして時には再発明する)まで、私はを始めたように感じました。実際に sedを学ぶ。コマンドの穏やかなリマインダーと構文に関する役立つヒントをお探しの場合は、sedのチートシートをダウンロードして、sedの学習を始めてください。


Linux
  1. Linuxgrepコマンドの使用方法

  2. Linuxでhistoryコマンドを使用する方法

  3. Linuxでidコマンドを使用する方法

  1. Linuxでsudoコマンドを使用する方法

  2. LinuxでSuコマンドを使用する方法

  3. Linux で「screen」コマンドを使用する方法

  1. Linuxをコマンドで使用する方法

  2. Linuxでlocateコマンドを使用する方法

  3. Linux sedコマンド:ストリームエディタの使用方法