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

クレイジーに聞こえるかもしれませんが、Linuxsedコマンドはインターフェイスのないテキストエディタです。コマンドラインから使用して、ファイルやストリームのテキストを操作できます。その力を活かす方法をお見せします。

sedの力

sed(実際の少なくとも多く、または)それはそれらを習得する基礎と生涯を学ぶために時間を要する:コマンドは、チェスのようなビットです。sed機能の主なカテゴリごとに、いくつかのオープニングギャンビットを紹介します。

sedパイプ入力またはテキストのファイルを処理するストリームエディタです。ただし、インタラクティブなテキストエディタインターフェイスはありません。むしろ、あなたはそれがテキストを通して機能するときに従うための指示を提供します。これはすべて、Bashおよびその他のコマンドラインシェルで機能します。

これによりsed、次のすべてを実行できます。

  • テキストを選択
  • 代替テキスト
  • テキストに行を追加する
  • テキストから行を削除する
  • 元のファイルを変更(または保存)する

例は、最も簡潔な(そして最も近づきにくい)sedコマンドを生成するのではなく、概念を紹介して示すように構成されています。ただし、のパターンマッチングおよびテキスト選択機能はsed 、正規表現(regexes)に大きく依存しています。を最大限に活用するには、これらにある程度精通している必要がありますsed

関連:Linuxで正規表現(regexes)を使用する方法

簡単な例

まず、パイプechosed介してテキストを送信するために使用しsed 、テキストの一部を置き換えます。これを行うには、次のように入力します。

エコーhowtogonk | sed's / gonk / geek / '

このechoコマンドは「howtogonk」をに送信しsed、単純な置換ルール(「s」は置換を表す)が適用されます。 sed 入力テキストで最初の文字列の出現を検索し、一致するものを2番目の文字列に置き換えます。

文字列「gonk」は「geek」に置き換えられ、新しい文字列がターミナルウィンドウに出力されます。

置換は、おそらく最も一般的な使用法ですsed。ただし、置換について詳しく説明する前に、テキストを選択して一致させる方法を知っておく必要があります。

テキストの選択

例としてテキストファイルが必要になります。サミュエル・テイラー・コールリッジの叙事詩「老水夫行」の詩のセレクションを含むものを使用します。

次のように入力して、次のように表示しますless

少ないcoleridge.txt

ファイルからいくつかの行を選択するために、選択する範囲の開始行と終了行を指定します。単一の番号がその1行を選択します。

1行目から4行目を抽出するには、次のコマンドを入力します。

sed -n '1,4p' coleridge.txt

1との間のコンマに注意してください4p「一致した行を印刷する」という意味です。デフォルトでは、 sed すべての行を印刷します。ファイル内のすべてのテキストが表示され、一致する行が2回印刷されます。これを防ぐために、-n(quiet)オプションを使用して、一致しないテキストを抑制します。

以下に示すように、別の詩を選択できるように行番号を変更します。

sed -n '6,9p' coleridge.txt

-e(式)オプションを使用して、複数の選択を行うことができます。2つの表現で、次のように2つの詩を選択できます。

sed -n -e '1,4p' -e '31、34p 'coleridge.txt

2番目の式の最初の数を減らすと、2つの詩の間に空白を挿入できます。次のように入力します。

sed -n -e '1,4p' -e '30、34p 'coleridge.txt

また、開始行を選択しsed て、ファイルをステップ実行し、5行ごとに代替行を印刷するか、任意の数の行をスキップするように指示することもできます。このコマンドは、範囲を選択するために上記で使用したものと似ています。ただし、今回~はカンマの代わりにチルダ()を使用して数字を区切ります。

最初の数字はスタートラインを示します。2番目の数字はsed、開始行の後のどの行を見たいかを示します。数字の2は1行おきを意味し、3は3行おきを意味します。

次のように入力します。

sed -n '1〜2p' coleridge.txt

探しているテキストがファイルのどこにあるかが常にわかるとは限りません。つまり、行番号が必ずしも役立つとは限りません。ただし、を使用sed して、一致するテキストパターンを含む行を選択することもできます。たとえば、「And」で始まるすべての行を抽出してみましょう。

キャレット(^)は行の始まりを表します。検索語はスラッシュ(/)で囲みます。また、「And」の後にスペースを含めるため、「Android」などの単語は結果に含まれません。

sedスクリプトを読むことは、最初は少し難しいかもしれません。/p それは我々が上記使用されるコマンドでやったような手段「印刷」。ただし、次のコマンドでは、スラッシュがその前にあります。

sed -n '/ ^ And / p'coleridge.txt

「And」で始まる3行がファイルから抽出され、表示されます。

代替を行う

最初の例では、sed置換の次の基本的な形式を示しました。

エコーhowtogonk | sed's / gonk / geek / '

s伝えsed 、これは置換です。最初の文字列は検索パターンであり、2番目の文字列は一致したテキストを置き換えるテキストです。もちろん、Linuxのすべてのものと同様に、悪魔は細部にあります。

次のように入力して、「日」のすべての出現箇所を「週」に変更し、船員とアホウドリが結合する時間を増やします。

sed -n's / day / week / p'coleridge.txt

最初の行では、「日」の2番目のオカレンスのみが変更されています。これは、sed行ごとの最初の一致後に停止するためです。以下に示すように、式の最後に「g」を追加してグローバル検索を実行し、各行のすべての一致が処理されるようにする必要があります。

sed -n's / day / week / gp 'coleridge.txt

これは、最初の行の4つのうち3つに一致します。最初の単語は「日」でsedあり、大文字と小文字が区別されるため、そのインスタンスは「日」と同じであるとは見なされません。

次のようにi 入力し、式の最後にあるコマンドにを追加して、大文字と小文字を区別しないことを示します。

sed -n's / day / week / gip 'coleridge.txt

これは機能しますが、すべてに対して大文字と小文字を区別しないようにする必要があるとは限りません。このような場合、正規表現グループを使用して、パターン固有の大文字と小文字を区別しないようにすることができます。

たとえば、文字を角かっこ([])で囲むと、「この文字リストの任意の文字」として解釈されます。

次のように入力し、グループに「D」と「d」を含めて、「Day」と「day」の両方に一致するようにします。

sed -n's / [Dd] ay / week / gp 'coleridge.txt

置換をファイルのセクションに制限することもできます。私たちのファイルの最初の詩に奇妙なスペースが含まれているとしましょう。次のよく知られたコマンドを使用して、最初の節を見ることができます。

sed -n '1,4p' coleridge.txt

2つのスペースを検索し、1つに置き換えます。これをグローバルに実行するため、アクションはライン全体で繰り返されます。明確にするために、検索パターンはスペース、スペースアスタリスク(*)であり、置換文字列は単一のスペースです。は1,4、置換をファイルの最初の4行に制限します。

これらすべてを次のコマンドにまとめます。

sed -n '1,4 s / * / / gp' coleridge.txt

これはうまく機能します!ここで重要なのは検索パターンです。アスタリスク(*)は、スペースである前の文字の0個以上を表します。したがって、検索パターンは1つ以上のスペースの文字列を検索します。

複数のスペースのシーケンスを1つのスペースに置き換えると、ファイルは通常の間隔に戻り、各単語の間に1つのスペースが入ります。これにより、場合によっては1つのスペースが1つのスペースに置き換えられますが、悪影響はありません。希望する結果が得られます。

次のように入力して検索パターンを1つのスペースに減らすと、2つのスペースを含める必要がある理由がすぐにわかります。

sed -n '1,4 s / * / / gp' coleridge.txt

アスタリスクは前の文字の0個以上に一致するため、スペースではない各文字を「ゼロスペース」と見なし、それに置換を適用します。

ただし、検索パターンに2つのスペースを含める場合 sedは、置換を適用する前に少なくとも1つのスペース文字を見つける必要があります。これにより、スペース以外の文字はそのまま残ります。

前に使用した-e(式)を使用して、次のように入力します。これにより、2つ以上の置換を同時に行うことができます。

sed -n -e's / motion / flutter / gip '-e's / ocean / gutter / gip' coleridge.txt

次のように、セミコロン(;)を使用して2つの式を区切ると、同じ結果を得ることができます。

sed -n's / motion / flutter / gip; s / ocean / gutter / gip 'coleridge.txt

次のコマンドで「day」を「week」に交換すると、「wella-day」という式の「day」のインスタンスも交換されました。

sed -n's / [Dd] ay / week / gp 'coleridge.txt

これを防ぐために、別のパターンに一致する行でのみ置換を試みることができます。開始時に検索パターンを持つようにコマンドを変更する場合、そのパターンに一致する行での操作のみを検討します。

次のように入力して、一致するパターンを「後」という単語にします。

sed -n '/ after / s / [Dd] ay / week / gp' coleridge.txt

それは私たちが望む応答を与えてくれます。

より複雑な置換

コールリッジに休憩を与えsedて、etc/passwdファイルから名前を抽出するために使用しましょう。

これを行うには短い方法がありますが(これについては後で詳しく説明します)、ここでは長い方法を使用して別の概念を示します。検索パターン(部分式と呼ばれる)で一致した各アイテムには、番号を付けることができます(最大9アイテム)。次に、sedコマンドでこれらの数値を使用して、特定の部分式を参照できます 。

()これを機能させるには、部分式を括弧[ ]で囲む必要があります。また、括弧の前に円記号(\)を付けて、通常の文字として扱われないようにする必要があります。

これを行うには、次のように入力します。

sed's / \([^:] * \)。* / \ 1 / '/ etc / passwd

これを分解しましょう:

  • sed 's/sedコマンドと代入式の始まり。
  • \((部分式を囲む開き括弧[ ]の前に円記号(\)を付けます。
  • [^:]*検索語の最初の部分式には、角括弧内のグループが含まれています。キャレット(^)は、グループで使用する場合は「しない」ことを意味します。グループとは、コロン(:)以外の文字が一致として受け入れられることを意味します。
  • \))前に円記号(\)が付いた閉じ括弧[ ] 。
  • .*この2番目の検索部分式は、「任意の文字とその数」を意味します。
  • /\1:式の置換部分には1、円記号(\)が前に付いています。これは、最初の部分式に一致するテキストを表します。
  • /'スラッシュ(/)と一重引用符(')を閉じると、sedコマンドが終了します。

これが意味することは、コロン(:)を含まない文字列を検索することです。これは、一致するテキストの最初のインスタンスになります。次に、その行で他に何かを検索します。これは、一致するテキストの2番目のインスタンスになります。行全体を最初の部分式に一致するテキストに置き換えます。

各行/etc/passwdのファイルは、コロンで終了するユーザ名で始まります。最初のコロンまですべてを一致させてから、その値を行全体に置き換えます。そのため、ユーザー名を分離しました。

次に、2番目の部分式を括弧[ ()]で囲んで、番号で参照できるようにします。また、交換してくださいよ\1 と\2。これで、コマンドは行全体を最初のコロン(:)から行の終わりまでのすべてに置き換えます。

次のように入力します。

sed's / \([^:] * \)\(。* \)/ \ 2 / '/ etc / passwd

これらの小さな変更により、コマンドの意味が逆になり、ユーザー名以外のすべてが取得されます。

それでは、これを行うためのすばやく簡単な方法を見てみましょう。

検索語は、最初のコロン(:)から行末までです。置換式は空(//)であるため、一致したテキストを何にも置き換えません。

したがって、次のように入力し、最初のコロン(:)から行の終わりまですべてを切り取り、ユーザー名だけを残します。

sed's /:.*// "/ etc / passwd

同じコマンドで最初と2番目の一致を参照する例を見てみましょう。

,姓名を区切るコンマ()のファイルがあります。それらを「姓、名」としてリストします。cat以下に示すように、を使用 してファイルの内容を確認できます。

cat geeks.txt

多くのsedコマンドと同様に、この次のコマンドは最初は侵入できないように見えるかもしれません。

sed's / ^ \(。* \)、\(。* \)$ / \ 2、\ 1 / g'geeks.txt

これは、これまで使用してきた他のコマンドと同様の置換コマンドであり、検索パターンは非常に簡単です。以下に分類します。

  • sed 's/通常の置換コマンド。
  • ^キャレットはグループ([])に含まれていないため、「行の始まり」を意味します。
  • \(.*\),最初の部分式は、任意の数の任意の文字です。括弧[ ()]で囲まれ、それぞれの前に円記号(\)が付いているため、番号で参照できます。これまでの検索パターン全体は、行の先頭から最初のコンマ(,)までの任意の数の任意の文字の検索として変換されます。
  • \(.*\) 次の部分式は(再び)任意の数の任意の文字です。また、括弧[ ()]で囲まれ、両方の前に円記号(\)が付いているため、一致するテキストを番号で参照できます。
  • $/ドル記号($)は行の終わりを表し、検索を行の終わりまで続行できるようにします。これは単にドル記号を紹介するために使用しました。*このシナリオではアスタリスク()が行の終わりにあるため、ここでは実際には必要ありません。スラッシュ(/)は、検索パターンセクションを完了します。
  • \2,\1 /g' 2つの部分式を括弧で囲んだので、両方を番号で参照できます。順序を逆にしたいので、として入力しますsecond-match,first-match。数字の前には円記号(\)を付ける必要があります。
  • /gこれにより、コマンドを各行でグローバルに機能させることができます。
  • geeks.txt作業中のファイル。

切り取りコマンド(c)を使用して、検索パターンに一致する行全体を置き換えることもできます。次のように入力して、「neck」という単語が含まれる行を検索し、新しいテキスト文字列に置き換えます。

sed '/ neck / c手首の周りに張られていた' coleridge.txt

抽出の下部に新しい行が表示されます。

行とテキストの挿入

新しい行やテキストをファイルに挿入することもできます。一致する行の後に新しい行を挿入するには、Appendコマンド(a)を使用します。

使用するファイルは次のとおりです。

cat geeks.txt

これを少しわかりやすくするために、行に番号を付けました。

次のように入力して、「He」という単語を含む行を検索し、その下に新しい行を挿入します。

sed '/ He / a->挿入されました!' geeks.txt

次のように入力し、挿入コマンド(i)を含めて、一致するテキストを含む行の上に新しい行を挿入します。

sed '/ He / i->挿入されました!' geeks.txt

&元の一致したテキストを表すアンパサンド()を使用して、一致する行に新しいテキストを追加できます。\1 、 \2など、マッチング部分式を表しています。

行の先頭にテキストを追加するには、行のすべてに一致する置換コマンドを使用し、新しいテキストを元の行と組み合わせる置換句と組み合わせます。

これをすべて行うには、次のように入力します。

sed's /.*/->挿入&/ 'geeks.txt

G各行の間に空白行を追加するコマンドを含めて、次のように入力します。

sed'G 'geeks.txt

あなたが2行以上の空白行を追加したい場合は、使用することができG;G、 G;G;Gなど。

行の削除

削除コマンド(d)は、検索パターンに一致する行、または行番号や範囲で指定された行を削除します。

たとえば、3行目を削除するには、次のように入力します。

sed '3d' geeks.txt

4行目から5行目の範囲を削除するには、次のように入力します。

sed '4,5d' geeks.txt

範囲外の行を削除するには、次のように感嘆符(!)を使用します。

sed '6,7!d' geeks.txt

変更を保存する

これまでのところ、すべての結果がターミナルウィンドウに出力されていますが、まだどこにも保存されていません。これらを永続的にするには、変更を元のファイルに書き込むか、新しいファイルにリダイレクトします。

元のファイルを上書きするには注意が必要です。あなたの場合はsed、コマンドが間違っている、あなたは元に戻すことは困難である元のファイルに変更を加える可能性があります。

安心のsed ために、コマンドを実行する前に元のファイルのバックアップを作成できます。

インプレースオプション(-i)を使用しsedて、元のファイルに変更を書き込むように指示 できますが、ファイル拡張子を追加するsed と、元のファイルが新しいファイルにバックアップされます。元のファイルと同じ名前になりますが、ファイル拡張子は新しくなります。

実例を示すために、「He」という単語を含む行を検索して削除します。また、BAK拡張子を使用して、元のファイルを新しいファイルにバックアップします。

これをすべて行うには、次のように入力します。

sed -i'.bak '' /^.* He。* $ / d'geeks.txt

次のように入力して、バックアップファイルが変更されていないことを確認します。

猫geeks.txt.bak

次のように入力して、出力を新しいファイルにリダイレクトし、同様の結果を得ることができます。

sed -i'.bak '' /^.* He。* $ / d'geeks.txt> new_geeks.txt

cat以下に示すように、変更が新しいファイルに書き込まれたことを確認するために使用します。

cat new_geeks.txt

すべてをsedした

お気づきかもしれませんが、この簡単な入門書でさえsedかなり長いです。このコマンドにはたくさんのことがあり、それを使ってできることはさらにたくさんあります。

しかし、うまくいけば、これらの基本的な概念が、さらに学び続けるにつれて構築できる強固な基盤を提供してくれます。