web-dev-qa-db-ja.com

sedとは何ですか?

私は最近多くのsedを見てきましたが、かなり混乱したコマンドであることがわかりました。マンページは特に有用ではありませんでしたが、他のコマンドの出力を解析するために使用できることは知っています。

sedとは正確に何であり、何を使用していますか? sedとは何か、一般的に使用されるもの、およびいくつかの基本的な例/構文を網羅した包括的な回答を探しています。

18
Seth

基本的な使用法では、文字列での「検索と置換」に使用されます。

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

返却値

"The quick brown fox jumps over the lazy cat"

Sedは、正規表現がSedと共に使用されると、本当に輝いています。

この記事sedについて、非常に包括的な説明をご覧ください。

18
demure

定義

Unix System V:実用的なガイド、Mark Sobell著:

Sedユーティリティは、バッチ(非対話型)エディターです。通常、sedコマンドはscript-fileに保存されます。 。 。ただし、コマンドラインから簡単なsedコマンドを指定できます。 。 。

Sed(GNU sed)4.2.2のmanページ:

Sedはストリームエディターです。ストリームエディタは、入力ストリーム(ファイルまたはパイプラインからの入力)で基本的なテキスト変換を実行するために使用されます。

私の非公式の定義:

Sedstream editorの略)は、テキストが一度に1行ずつ処理されたときに開発されたテキスト処理ユーティリティですが、最も強力なUnix/Linuxユーティリティ。同時に、テキスト処理用に特別に設計されたスクリプト言語の形式です。

用途

定義が示唆するように、sedは、テキストの行、テキストファイル、およびテキストのパイプストリームのバッチ処理に使用されます。ほとんどの場合、テキストの置換と削除に使用されます。

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

ただし、他のコマンドの動作を模倣するためにも使用できます。たとえば、

  • dmesg | head -n 3(最初の3行を印刷)を模倣するには、dmesg | sed -n 1,3pを実行します。
  • dmesg | grep 'wlan0'(文字列の検索)を模倣するには、dmesg | sed -n '/wlan0/p'を実行します。
  • リストアイテム

sedが他のテキスト処理ユーティリティよりも優れている大きな利点は、-iフラグです。つまり、編集したテキストを画面に出力するだけでなく、実際に編集を元のファイルに保存できます。対照的に、awkフレーバーは、GNU awkバージョンでのみこのような機能を備えています。

sedは、セミコロン(;)で区切られた複数のパターン、または-fフラグの後に指定されたスクリプトファイルからコマンドラインで入力を取得できます。 cat someTextfile.txt | sed -f myScript.sed

Sedアプリケーションと例

4

この回答は進行中の作業です-susbstituteコマンドに関する他の例を見逃しています


sedとは何ですか?

sed = Stream EDitor

GNU sed 4.2.2レポートのマニュアルページの説明:

Sedはストリームエディターです。ストリームエディタは、入力ストリーム(ファイルまたはパイプラインからの入力)で基本的なテキスト変換を実行するために使用されます。スクリプト編集(edなど)を許可するエディターに似ている点もありますが、sedは入力を1回だけ渡すことで機能するため、より効率的です。しかし、パイプライン内のテキストをフィルター処理するsedの機能は、他のタイプのエディターと特に区別します。

Gnu.orgの GNU sedページの説明 レポート:

sed(ストリームエディター)は、インタラクティブなテキストエディターではありません。代わりに、テキストのフィルタリングに使用されます。つまり、テキスト入力を受け取り、そのテキストに対して何らかの操作(または一連の操作)を実行し、変更されたテキストを出力します。 sedは通常、パターンマッチングを使用してファイルの一部を抽出するか、ファイル内の文字列の複数の出現を置換するために使用されます。

sedは何に使用されますか?

データのストリーム(通常はテキストですが、バイナリデータの変更にも使用できます)に複雑な変更を加えるために使用できます。

最も一般的な使用例には次のものがあります。

  • 基本/拡張正規表現を使用してテキストファイルから行を選択的に印刷/削除する
  • 基本/拡張正規表現を使用してテキストファイル内の文字列をグローバルに置換する
  • 基本/拡張正規表現を使用してテキストファイル内の文字列を選択的に置き換える

これらは、この回答で説明されている使用例です。

使用法

sedは、呼び出し中にコマンドライン引数でファイル名が指定されている場合はファイルシステムに保存されているファイルから、ファイル名が指定されていない場合はstdinから入力を読み取ります。

ファイルシステムに保存されたファイルを使用した最小限の呼び出し:

sed '' file

stdinを使用した最小限の呼び出し:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

こんにちは世界!

sedはデフォルトで入力ファイルを1行ずつ読み取ります。 1行を読み取り、行の末尾の改行を削除し、処理された行を「パターンスペース」に入れます。最後に、リストされたコマンドをパターンスペースの現在のコンテンツで実行し、入力ファイルから新しい行を読み取ります。

コマンドが指定されていない場合、またはpまたはdコマンドが指定されている場合*、sedは、パターン空間の現在の内容を出力し、その後に関係なく各反復で改行が続きます。

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

これを防ぐには、-nスイッチとともにsedを呼び出します。

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* pd、およびsコマンドについてのみ話す。これらのコマンドは、この回答で取り上げられています。

行の選択

sedは、入力ファイル全体を処理することも、入力ファイルの選択された行のみを処理することもできます。処理する入力ファイルの行の選択は、「アドレス」を指定することにより行われます。アドレスは(特に)行番号またはパターンのいずれかです。行の範囲は、アドレスの範囲を指定することにより選択できます。

アドレスの可能な組み合わせは次のとおりです。

  • <N><N>は数字):次のコマンド/コマンドは、行番号<N>でのみ実行されます。
  • <N>,<M>(ここで<N><M>は2つの数字、<N>> <M>):次のコマンド/コマンドは、行番号<N>から行番号<M>までの行で実行されます。
  • /<pattern>/<pattern>は基本または拡張正規表現):次のコマンド/コマンドは、<pattern>の出現を含む行でのみ実行されます。
  • /<pattern1>/,/<pattern2>/(ここで<pattern1><pattern2>は基本または拡張正規表現):次のコマンド/コマンドは、<pattern1>の出現を含む最初の行から<pattern2>の出現を含む次の行までの行で実行されます。複数の場合<pattern1>-<pattern2>の発生を注文しました。
  • <N>,/pattern/<N>は数字、<pattern>は基本または拡張正規表現):次のコマンド/コマンドは、行番号<N>から<pattern>の出現を含む最初の行までの行で実行されます。
  • /pattern/,<N><pattern>は基本または拡張正規表現、<N>は数値):次のコマンド/コマンドは、<pattern>の出現を含む最初の行から行番号<N>までの行で実行されます。

行の範囲で印刷、削除、または置換を実行するために実行される選択には、指定されたアドレスに一致する行が常に含まれます。さらに、パターンを使用して行の範囲で印刷、削除、または置換を実行するために実行される選択はlazyおよびglobalです(つまり、影響を受ける各範囲は常に可能な限り小さくしてください。複数の範囲が影響を受けます)。

行の範囲を印刷する場合、または置換が実行された行のみを印刷する場合、基準に一致する行が2回印刷されるのを防ぐために、sed-nスイッチと共に呼び出す必要があります(これは行の範囲を印刷する場合にのみ発生します)基準に一致しない行が関係なく印刷されるのを防ぐため。

処理する行の選択の後には、コマンドまたは中括弧を使用してグループ化された複数のセミコロンで区切られたコマンドが続く必要があります。

コマンド:印刷、削除

選択範囲の印刷または削除に使用されるコマンドは、それぞれ次のとおりです。

  • p:指定されたアドレス/アドレスの範囲に一致する行を出力します。
  • d:指定されたアドレス/アドレスの範囲に一致する行を削除します。

これらのコマンドの1つがnotの前にアドレス/選択がある場合、コマンドはグローバルに、つまり入力ファイルの各行で実行されます。

例:印刷、削除

数値アドレスを指定する行の印刷/削除:

サンプルファイル:

line1
line2
line3
line4
line5
  • <N>の印刷:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • <N>の削除:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • <N>から<M>までの行の印刷:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • <N>から<M>までの行を削除:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

パターンを指定する行の印刷/削除:

サンプルファイル:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • <pattern>に一致する行を印刷:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • <pattern>に一致する行の削除:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • <pattern1>に一致する行から<pattern2>に一致する行までの行の印刷:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • <pattern1>に一致する行から<pattern2>に一致する行までの行を削除:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

コマンド:代替

選択に対して置換を実行するために使用されるコマンドは次のとおりです。

  • s:指定されたアドレス/アドレスの範囲に一致する行を置換します。

このコマンドがnotの前にアドレス/選択がある場合、コマンドはグローバルに、つまり入力ファイルの各行で実行されます。

sコマンドの構文は次のとおりです。

s/<pattern>/<replacement_string>/<pattern_flags>

スラッシュは「区切り文字」です。 <pattern><replacement_string>、および<pattern_flags>セクションを区切るために使用されます。

区切り文字は、常にsコマンドの直後の文字です。 |などの他の文字に設定できます。

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>は、基本または拡張正規表現です。 <replacement_string>は、特別な意味を持つsed固有のシーケンスを含む固定文字列です。 <pattern_flags>は、<pattern>の動作を変更するフラグのリストです。

特別な意味を持つ最も一般的なsed固有のシーケンス:

  • &<pattern>に一致する文字列で置換された後方参照。
  • \<N>(ここで<N>は数字):<N>でキャプチャされた<pattern>グループで置き換えられた後方参照。

最も一般的なフラグ:

  • g<pattern>を強制的にグローバルに、つまり各行で複数回一致させます。
  • i<pattern>を大文字と小文字を区別せずに強制的に一致させます。
  • p:置換が再度実行された行を印刷します(sedの呼び出しで-nスイッチを使用して、置換が実行された行のみを印刷する場合に便利です)。

例:代替

サンプルファイル:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the Word
A-well-a bird, bird, bird, the bird is the Word
A-well-a bird, bird, bird, well the bird is the Word
A-well-a bird, bird, bird, b-bird's the Word
A-well-a bird, bird, bird, well the bird is the Word
A-well-a bird, bird, b-bird's the Word
A-well-a bird, bird, bird, b-bird's the Word
A-well-a bird, bird, bird, well the bird is the Word
A-well-a bird, bird, b-bird's the Word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the Word!
A-well-a bird, bird, b-bird's the Word
A-well-a...
  • 各行で<pattern>の最初の出現を<replacement_string>で置き換える:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the Word
A-well-a birds, bird, bird, the bird is the Word
A-well-a birds, bird, bird, well the bird is the Word
A-well-a birds, bird, bird, b-bird's the Word
A-well-a birds, bird, bird, well the bird is the Word
A-well-a birds, bird, b-bird's the Word
A-well-a birds, bird, bird, b-bird's the Word
A-well-a birds, bird, bird, well the bird is the Word
A-well-a birds, bird, b-bird's the Word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the Word!
A-well-a birds, bird, b-bird's the Word
  • 各行で<pattern>のすべての出現を<replacement_string>に置き換えます。
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, the birds is the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the Word!
A-well-a birds, birds, b-birds's the Word
A-well-a...
  • <pattern1>で始まる行のみを選択し、出現する<pattern2>をすべて<replacement_string>に置き換えます。
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the Word
  • <pattern1>で終わる行のみを選択し、<pattern2>のすべての出現を<replacement_string>に置き換えます。
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/Word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, the birds is the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a birds, birds, b-birds's the Word
1
kos

sedは強力なコマンドであり、これを使用すると(行の削除、文字列の置換、文字列のフィルタリングなど)を行うことができます。

Argsを使用して使用のリストを提供できますが、インターネットはそれでいっぱいです。 sed usage by examplesを検索すると、多くの結果が得られます。かわいいものです。 http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/

1
ssoto