sed (ストリーム エディターを意味し、英語の "" の略語に由来) は、シンプルでコンパクトなプログラミング言語を使用してテキストを解析および変換する Unix ユーティリティです。

セド

sed (ストリーム エディタの意味。英語の "" の略語に由来)は、シンプルでコンパクトなプログラミング言語を使用してテキストを解析および変換するためのUnixユーティリティ プログラムです。

セド
脚本
デザイナー リー・E・マクマホン
1974年
実装言語 C
Webサイト
感動的な言語
言語に影響を与える
チョムスキー、  Perl、  AWK

sed は、 1973 年から 1974 年にかけてベル研究所の Lee E. McMahon によって開発され、現在ほとんどのオペレーティング システムで利用可能です。sed は、対話型エディター ed (「エディター」、1971 年) および初期の qed (「クイック エディター」、1965 ~ 1966 年) のスクリプト機能に基づいています。sed は、正規表現をサポートした最初のツールの 1 つであり、現在でもテキスト処理、特に置換コマンドに使用されています。プレーン テキスト文字列の操作と「ストリーム編集」のための一般的なツールもAWKPerlです 。

歴史

sed は、データ ファイルのコマンド ライン処理用に構築された初期の Unix コマンドの 1 つで、バージョン 7 Unix で初めて登場しました。これは、人気のあるgrepコマンドの後継として自然に進化しました元々の動機は grep (g/re/p) の置き換えに似ていたため、「g/re/s」という名前が付けられました。これにより、g/re/d などのコマンドごとに特殊なプログラムが作成されることを懸念して、Lee E. McMahon は、後に sed となる一般的な行指向のストリーム エディタを作成しました。sed の構文、特に/パターン マッチングとs///置換での使用は、sed の前身である ed に由来し (ed は当時非常に一般的に使用されていました)、正規表現構文は他の言語、特に ECMAScript とPerl影響を与えました。その後、より強力な言語AWKが登場し、これらのツールが相互に補完し合うことで、シェル スクリプトを通じて強力なテキスト処理を完了できるようになりました。sed と AWK は、Perl の祖先でありインスピレーションの源であると考えられており、Perl の構文とセマンティクス、特に一致演算子と置換演算子に影響を与えてきました。

GNU  sed には、ファイルのインプレース編集など、いくつかの新機能が追加されています。Super-sed は、 Perl互換の正規表現 を含む sed の拡張バージョンですsed の別の亜種であるminised は 、元々は4.1BSD sed のリバース エンジニアリングを通じてEric Raymondによって書かれ、現在は René Rebe によって保守されています。GNU プロジェクトが新しい GNU 正規表現ライブラリに基づいて新しいバージョンの sed を作成するまで、GNU プロジェクトは最小化されていました。現在マイニングされているものには、BSD sed への拡張機能がいくつか含まれていますが、GNU sed ほど機能は豊富ではありません。その利点は、高速であり、メモリ使用量が少ないことです。これは組み込みシステムで使用され、Minix が提供する sed のバージョンです。

動作モード

sed は行指向のテキスト処理ユーティリティです。入力ストリームまたはファイルからテキストを 1 行ずつ読み取り、パターン スペースと呼ばれる 内部バッファに入れます。各行を読み取った後にループを開始します 。パターン空間の場合、sed はsed スクリプト で指定された 1 つ以上の操作を適用します。sed は、テキスト操作を指定する約 25 個のコマンドを含むプログラミング言語を実装します 。スクリプトの実行後、各入力行に対して sed は通常、パターン スペース (スクリプトによって変更された行) を出力し、次の行からループを再度開始します。パターン スペースの削除、終了、パターン スペースへの次の行の即時追加など、その他のスクリプト終了動作は、sed オプションとスクリプト コマンドを通じて使用できます。したがって、sed スクリプトはストリームの行を横断するループ本体に対応し、ループ自体とループ変数 (現在の行番号) は暗黙的に sed によって維持されます。dqN

sed スクリプトは、コマンドラインで指定することも ( -eオプション)、別のファイルから読み取ることもできます ( -fオプション)。sed スクリプトのコマンドでは、行番号または正規表現をアドレスとして使用できます 。このアドレスにより、コマンドがいつ実行されるかが決まります。たとえば、 (delete) コマンドは2d2 番目の入力行でのみ実行されd(2 番目の入力行を除くすべての行が印刷されます)、/^ /dスペースで始まるすべての行は削除されます。いくつかの個別の特別なバッファ (スペースを保持するなど) は、ループ間でテキストを保持および蓄積するために、いくつかの sed コマンドで使用できます。sed のコマンド言語には 2 つの変数 (「ホールド スペース」と「パターン スペース」) と GOTO に似た分岐関数しかありませんが、この言語はチューリング完全版であり、箱を押したりレンガを壊したりするための難解な sed スクリプトも作成できます。 . ブロック、チェス、テトリスなどのゲーム。

入力ストリームの各行に対してメイン ループを 1 回実行し、入力の各行で sed スクリプトを評価します。sed スクリプトの各行はパターンとアクションのペアであり、一致するパターンと実行する操作を示します。これらは条件付きステートメントに再結合できます。メイン ループ、作業変数 (パターン スペースとホールド スペース)、入出力ストリーム、およびデフォルト操作 (パターン スペースへの行のコピー、パターン スペースの印刷) は暗黙的であるため、簡潔な 1 行プログラムを作成できますたとえば、次の sed プログラム:

10q

入力の最初の 10 行を出力して停止します。

使用法

置換コマンド

次の例は、置換のための sed の典型的な (そして最も一般的な) 使用法を示しています。この使用法は確かに sed の元々の動機でした。

sed 's/regexp/replacement/g' 入力ファイル名 > 出力ファイル名

sed の一部のバージョンでは、-e式の後に式が続くことを示すために式を前に置く必要があります。sは置換を意味しますが、 はgグローバルを意味し、行内のすべての出現が置換されることを意味します。検索する正規表現(パターン)は最初の区切り文字 (ここではスラッシュ) の後に配置され、置換される文字列は 2 番目の区切り文字の後に配置されます。スラッシュ ( /) は、ed の「検索」文字として生まれた伝統的な記号ですが、パターンや置換テキストに現れない他の記号を区切り文字として使用すると、読みやすくなります。これにより、「傾き」を回避できます。つまようじ症候群。」

replace コマンドは ed の search-replace から派生し、単純な解析とテンプレート化を実装します。パターン マッチングと、プレーン テキストとして、または "exact match" や n 番目の部分式 (from to )などの特別なエスケープ シーケンスを含む形式文字列として、部分式をregexp介してテキストを保存する機能を提供します。たとえば、 既存の「s」をコピーせずに、出現するすべての「cats」または「dogs」を「cat」または「dog」に置き換えます。正規表現では、これが最初 (そして唯一) 保存された部分式式です文字列を出力にフォーマットします。replacement&\1\9sed -r "s/(cat|dog)s?/\1s/g"(cat|dog)\1

その他の sed コマンド

置換以外にも、25 個程度の sed コマンドを使用して簡単な処理が可能です。たとえば、 空の行またはスペースのみを含む行を削除するには、次のdコマンドを使用します。

sed '/^ *$/d' inputFileName

この例では、次の正規表現メタキャラクターを使用します (sed はすべての正規表現をサポートしています)。

  • キャレット (  ^ ) は行の先頭に一致します。
  • ドル記号 (  $ ) は行末に一致します。
  • アスタリスク (  * ) は、前の文字の 0 個以上の出現と一致します。

非常に複雑な sed 構造を持つことが可能であり、sed をシンプルだが高度に特殊化されたプログラミング言語として使用できますbたとえば、制御フローはラベル (コロンとそれに続く文字列) と分岐命令を使用して管理できます。ディレクティブbの後に有効なタグ名を指定すると、そのタグに続くブロックに処理が移動します。

フィルタとしての sed

Unix では、sed はパイプ内のフィルターとしてよく使用されます。

データを生成する | sed 's/x/y/g'

つまり、「generateData」などのプログラムがデータを生成し、sed を使用してxをyに置き換えます例えば:

$ エコーxyzxyz | sed 's/x/y/g' 
yyz yyz

ファイルベースの sed スクリプト

多くの場合、複数の sed コマンド (1 行に 1 つのコマンド) をスクリプト ファイル (例: subst.sed) に記述し、オプションを使用して-fファイルからコマンドを実行するとs/x/y/g便利です(例: )。

sed -f subst.sed 入力ファイル名 > 出力ファイル名

スクリプト ファイルには任意の数のコマンドを配置でき、スクリプト ファイルを使用すると、シェルのエスケープや置換に関する問題を回避することもできます。

このようなスクリプト ファイルは、sed コマンドを含む「shebang 行」を先頭に追加し、ファイルに実行権限を割り当てることで、コマンド ラインから直接実行できます。たとえば、次の内容のファイルを作成できますsubst.sed

#!/bin/sed -f 
s/x/y/g

現在のユーザーは、次のchmodコマンドを使用してファイルを実行可能にできます。

chmod u+x 置換 sed

ファイルはコマンド ラインから直接実行できます。

subst.sed 入力ファイル名 > 出力ファイル名

その場で編集

GNU sed に導入された-iオプションにより、ファイルのインプレース編集が可能になります (実際には、一時出力ファイルがバックグラウンドで作成され、元のファイルがその一時ファイルに置き換えられます)。例えば:

sed -i 's/abc/def/' ファイル名

こんにちは、世界! 例

# 入力テキスト ストリームを「Hello, world!」に変換します。
s/.*/Hello, world!/ 
q

この「Hello, world!」スクリプトはファイル (script.txt など) にあり、sed -f script.txt inputFileName「inputFileName」が入力テキスト ファイルである場合に呼び出されます。スクリプトは、「inputFileName」の 1 行目を「Hello, world!」に変更して終了し、sed が終了する前に結果を出力します。1 行目以降の入力行は読み取られず、印刷もされません。出力は「Hello, world!」のみです。

この例では、sed の主要な機能の多くを強調しています。

  • セドはユニークです。これに似た「Hello, world!」の例は他にありません。
  • 典型的な sed プログラムは非常に短いです。
  • sed スクリプトにはコメント (#記号で始まる行) を含めることができます。
  • s(replace) コマンドは最も重要な sed コマンドです。
  • sed では、q(exit) などのコマンドを使用して簡単なプログラミングができます。
  • .* sed は、(0 個以上の任意の文字)などの正規表現を使用します。

その他の簡単な例

以下にさまざまな sed スクリプトを示します。これらは引数として sed に渡すことも、別のファイルに入れて実行可能ファイルによって実行することも-f、スクリプト自体を実行可能にすることによっても実行できます。

ファイル内の単語 (IRC パスワードなど) を「REDACTED」に置き換えて結果を保存するには:

sed -is/yourpassword/REDACTED/ ./status.freenode.log

「yourword」という単語を含むすべての行 ( アドレス 「/yourword/」) を削除するには:

/あなたの言葉/ d

すべての単語「yourword」を削除するには:

s/あなたの言葉//g

ファイルから 2 つの単語を同時に削除するには:

s/ファーストワード//g 
s/セカンドワード//g

前の例を 1 行で表現するには、たとえばコマンド ラインに入力する場合、2 つのコマンドをセミコロンで接続します。

sed "s/firstword//g; s/ Secondword//g" inputFileName

複数行の処理例

次の例では、sed (通常は 1 行でのみ機能します) は、行に続く行がスペースで始まる場合に改行を削除します。次のテキストを考えてみましょう。

これは私の犬で、
 名前はフランクです。
これは私の魚です、
名前はジョージです。
これは私のヤギです、
 名前はアダムです。

以下の sed スクリプトは、上記のテキストを次のテキストに変換します。このスクリプトはスペースで始まる入力行にのみ影響することに注意してください。

これは私の犬で、名前はフランクです。
これは私の魚です、
名前はジョージです。
これは私のヤギです、名前はアダムです。

使用されるスクリプトは次のとおりです。

N 
s/\n / / 
P 
D

このスクリプトは次のように理解する必要があります。

  • ( N) 次の行をパターンスペースに追加します。
  • ( s/\n / /) スペースが後に続く改行文字を見つけてスペースに置き換えます。
  • ( P) パターンスペースの一番上の行を印刷します。
  • ( D) パターンスペースから先頭の行を削除し、スクリプトを再度実行します。

これはセミコロンを使用して 1 行で表現できます。

セド 'N; s/\n / /; P; D' 入力ファイル名

制限と代替案

sed にはそのシンプルさと制限がありますが、多くの用途に十分強力です。より複雑な処理の場合は、 AWKPerl 、PowerShell などのより強力な言語を使用できます。理論的には、ホールド バッファを使用して複雑な変換を任意に実行することは可能ですが、行を変換する方法が正規表現の抽出やテンプレートの置換よりも複雑な場合は、通常、上記で説明したより強力な言語を使用することになります。

代わりに、より単純な操作のために、 grep (パターンに一致する行を出力)、head (ファイルの最初の部分を出力)、tail (ファイルの最後の部分を出力)、tr (文字の変換または削除) などの特殊な Unix ユーティリティを使用します。多くの場合、より このような特殊なユーティリティは、多くの場合、実行するように設計された特定のタスクに関して、より一般的なソリューション (sed など) よりもシンプル、明確、高速です。

ed/sed のコマンドと構文は、テキスト エディターvivimなどの派生プログラムで引き続き使用されます。sam/ssam は ed/sed に似ています。sam はPlan 9エディター、ssam はそのストリーム インターフェイスであり、その機能は sed に似ています。

コメント

  1.  コマンドラインの使用では、式を囲む引用符は必要ありません。シェルが式を単一の単語 (トークン) として解釈しない場合にのみ必要になります。スクリプトはs/x/y/g明確なので、generateData | sed s/x/y/g正常に動作します。ただし、明確にするために、通常、特にスペースがある場合 (たとえば、's/x x/y y/') には引用符が使用されます。ほとんどの場合、一重引用符は、シェルが$シェル変数として解釈するのを避けるために使用されます。"s/$1/$2/g"シェルにコマンドライン引数または他のシェル変数を置き換えさせるには、二重引用符を使用します (例: ) 。

参考文献

  1.  . [2013-05-21]. (元のコンテンツは2018-06-27 にアーカイブされました)。
  2.  . [2013-05-21]. (元のコンテンツは2018-06-27 にアーカイブされました)。
  3. McIlroy, MD (PDF) (Technical Report). CSTR. Bell Labs. 1987 [2018-11-10]. 139. ( 2019-11-30 の オリジナル(PDF)からアーカイブ ).
  4.  。[2018-11-10]。元の内容は2017-09-07に保存されています)。しばらくして、別の特別な目的のプログラム、gres の代わりに g/re/s の需要が生じました。リー・マクマホンはこの作品の執筆を引き受け、すぐに家族に終わりはないことを予見しました。g/re/d、g/re/a など。彼のコンセプトが発展するにつれて、それはセドナになりました…
  5.  . [2018-11-10]. (元のコンテンツは2018-02-20 にアーカイブされました)。
  6.  . [2018-11-10]. (元のコンテンツは2018-01-16 にアーカイブされました)。
  7.  . [2009-04-20]. ( 2006-02-08 のオリジナルからアーカイブ)。
  8.  . GitHub. [2018-11-10]. (元のコンテンツは2018-12-02 にアーカイブされました)。
  9.  . [2018-11-10]. (オリジナル コンテンツは2018-12-02 にアーカイブされました)。

参考文献

外部リンク

ウィキブックの関連電子機器: en:sed

チュートリアル

その他のリンク

見る

この記事は Wikipediaから引用しています。このテキストは、 クリエイティブ コモンズ - 表示 - 継承に基づいてライセンスされています。メディア ファイルには追加の規約が適用される場合があります。

おすすめ

転載: blog.csdn.net/weixin_40191861/article/details/132857870