Welcome to Our Website

LinuxでSedストリームエディタを使用してテキストを操作するための基本

はじめに

sedコマンドは、ストリームエディタの略で、標準入力またはファイルからのテキストに対して編集操作を実行します。 sed行ごとに非対話的な方法で編集します。

これは、コマンドを呼び出しているときにすべての編集決定を行い、sedは指示を自動的に実行することを意味します。, これは混乱したり直感的ではないように見えるかもしれませんが、特にスクリプトや自動化されたワークフローの一部として、テキストを変換するため

このチュートリアルでは、いくつかの基本的な操作をカバーし、このエディタを操作するために必要な構文を紹介します。 通常のテキストエディタをsedに置き換えることはほとんどありませんが、おそらくテキスト編集ツールボックスへの歓迎された追加

注:このチュートリアルでは、Ubuntuおよびその他のLinuxオペレーティングシステムにあるsedのGNUバージョンを使用します。, MacOSを使用している場合は、異なるオプションと引数を持つBSDバージョンがあります。 GNUバージョンのsedbrew install gnu-sedを使用してHomebrewでインストールすることができます。

インタラクティブターミナルを起動します!

基本的な使い方

sedテキストファイルまたは標準入力(STDIN)から読み取るテキストのストリームを操作します。 つまり、編集のために別のコマンドの出力を直接sedに送信することも、既に作成したファイルで作業することもできます。,また、sedすべてをデフォルトで標準出力(STDOUT)に出力することにも注意してください。 つまり、リダイレクトされない限り、sedは、ファイルに保存するのではなく、その出力を画面に出力します。

基本的な使い方は次のとおりです。

  • sed commands

このチュートリアルでは、BSDソフトウェアライセンスのコピーを使用して、sedを試します。, Ubuntuでは、以下のコマンドを実行してBSDライセンスファイルをホームディレクトリにコピーして作業できるようにします。

  • cd
  • cp /usr/share/common-licenses/BSD .

BSDライセンスのローカルコピーを持っていない場合は、次のコマンドで自分で作成します。

  • cat << 'EOF' > BSD
  • Copyright (c) The Regents of the University of California.
  • All rights reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions
  • are met:
  • 1. Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
  • 2. Redistributions in binary form must reproduce the above copyright
  • notice, this list of conditions and the following disclaimer in the
  • documentation and/or other materials provided with the distribution.
  • 3. Neither the name of the University nor the names of its contributors
  • may be used to endorse or promote products derived from this software
  • without specific prior written permission.
  • THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  • ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  • IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  • ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  • FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  • DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  • OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  • HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  • LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  • OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  • SUCH DAMAGE.
  • EOF

sedBSDライセンスファイルの内容を表示しましょう。 sedデフォルトでは結果が画面に送信されます。, 次のコマンドを実行してみてください。

  • sed '' BSD

BSDライセンスが画面に表示されます。

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.......

一重引quotesには、sedに渡す編集コマンドが含まれます。 この場合、何も渡さなかったため、sed受信した各行を標準出力に出力しました。

sedファイルではなく標準入力を使用できます。, catコマンドの出力をsedにパイプして、同じ結果を生成します。

  • cat BSD | sed ''

ファイルの出力が表示されます。

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

ご覧のように、ファイルまたはテキストストリームを操作できます。生成されたもののように、ファイルまたはテキストストリームを操作することができます。パイプ(|)文字で出力をパイプすると、同じように簡単になります。

印刷行

前の例では、sedに渡された入力が、操作なしで結果を標準出力に直接印刷することがわかりました。,

sedの明示的なprintコマンドを調べてみましょう。p一重引quotesで囲む文字を使用して指定します。

次のコマンドを実行します。

BSDファイルの各行が表示されます。

Output
Copyright (c) The Regents of the University of California.Copyright (c) The Regents of the University of California.All rights reserved.All rights reserved.Redistribution and use in source and binary forms, with or withoutRedistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsmodification, are permitted provided that the following conditionsare met:are met:. . .. . .

sedデフォルトで各行を自動的に印刷し、行を印刷するように指示しました。明示的に”p”コマンドを使用すると、各行が二度印刷されます。,

出力をよく調べると、sedがデータ行ごとに動作することを示すように、最初の行が二回続き、次の行が二回続くなどがわかります。 行を読み取り、それを操作し、次の行でプロセスを繰り返す前に結果のテキストを出力します。

結果をクリーンアップするには、-nオプションをsedに渡します。

  • sed -n 'p' BSD
Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

これで、各行の印刷に一度戻ります。,

これまでの例は編集とはほとんど考えられません(各行を二度印刷したい場合を除き…)。 次に、sedがテキストデータの特定のセクションをターゲットにして出力を変更する方法について説明します。

アドレス範囲を使用する

アドレスを使用すると、テキストストリームの特定の部分をターゲットにできます。 特定の行または行の範囲を指定することもできます。

持ってみましょうsedファイルの最初の行を印刷します。, 次のコマンドを実行します。

  • sed -n '1p' BSD

最初の行が画面に表示されます。

Output
Copyright (c) The Regents of the University of California.

番号を配置することにより、1印刷コマンドの前に、sed操作する行番号を指定しました。

  • sed -n '1,5p' BSD

この出力が表示されます:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditions

アドレス範囲をsedに指定しました。, あなたが与えた場合sedアドレス、それはそれらの行に続くコマンドのみを実行します。 この例では、sedに1行目から5行目までを印刷するように指示しました。 最初のアドレスを指定し、次にオフセットを使用してsedに移動する追加の行の数を指示することで、これを別の方法で指定することができます。

  • sed -n '1,+4p' BSD

sed1行目から始まり、次の4行目でも操作するように指示したため、これは同じ出力になります。,他のすべての行を印刷する場合は、~文字の後に間隔を指定します。 次のコマンドは、BSDファイル内の他のすべての行を1行目から出力します。

  • sed -n '1~2p' BSD

出力は次のとおりです。

Output
Copyright (c) The Regents of the University of California.modification, are permitted provided that the following conditions1. Redistributions of source code must retain the above copyright2. Redistributions in binary form must reproduce the above copyright documentation and/or other materials provided with the distribution. may be used to endorse or promote products derived from this software. . .. . .

sed出力からテキストを削除するには、sedを使用します。,

テキストの削除

pコマンドをdコマンドに変更することで、以前にテキスト印刷を指定していたテキスト

この場合、-nコマンドは必要ありません。sedは削除されていないものをすべて印刷するためです。 これは何が起こっているかを見るのに役立ちます。,

前のセクションの最後のコマンドを変更して
最初の行から始まる他のすべての行を削除します。

  • sed '1~2d' BSD

結果は、最後に与えられなかったすべての行を見ることになります。

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

ここでは、ソースファイルが影響を受けていないことに注意することが重要です。 それはまだ無傷です。 編集内容は画面に出力されます。,

編集内容を保存したい場合は、標準出力を次のようなファイルにリダイレクトできます。

  • sed '1~2d' BSD > everyother.txt

cat:

  • cat everyother.txt

以前に画面に表示されたのと同じ出力が表示されます。

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

sedコマンドはデフォルトでソースファイルを編集しませんが、-iオプションを渡すことでこの動作を変更できます。”これは、ソースファイルを変更します。,

警告:-iスイッチを使用すると、元のファイルが上書きされるため、注意して使用する必要があります。 最初に-iスイッチを使用せずに操作を実行し、次に-i必要なものがあれば、元のファイルのバックアップを作成するか、出力をファイルにリダイレクトします。 誤って元のファイルを変更するのは非常に簡単です-iスイッチ。

作成したばかりのeveryother.txtファイルをインプレースで編集して試してみましょう。, 他のすべての行を削除してファイルをさらに減らしましょう
再び:

  • sed -i '1~2d' everyother.txt

catを使用してcat everyother.txtでファイルを表示すると、ファイルが編集されていることがわかります。

-iオプションは危険です。 ありがたいことに、sedは、編集前にバックアップファイルを作成する機能を提供します。,

編集前にバックアップファイルを作成するには、”-i”オプションの直後にバックアップ拡張子を追加します。

  • sed -i.bak '1~2d' everyother.txt

これにより、.bak拡張子を持つバックアップファイルが作成され、元のファイルをインプレースで編集します。

次に、sedを使用して検索および置換操作を実行する方法を見ていきます。

テキストの置換

おそらくsedの最もよく知られた用途は、テキストの置換です。, sed正規表現を使用してテキストパターンを検索し、見つかったテキストを他のものに置き換えることができます。

正規表現の詳細については、LinuxでGrep正規表現を使用してテキストパターンを検索することに従ってください。

最も基本的な形式では、次の構文を使用して単語を別の単語に変更できます。

's/old_word/new_word/'

sは代替コマンドです。 三つのスラッシュ(/)は、異なるテキストフィールドを区切るために使用されます。, フィールドを区切るために他の文字を使用すると、より役に立つ場合があります。

たとえば、ウェブサイト名を変更しようとしている場合、Urlにはスラッシュが含まれているため、別の区切り文字を使用すると便利です。

次のコマンドを実行して、echoでURLを印刷し、sedでアンダースコア(_)文字を区切り文字として使用します。

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'

これはcom/indexorg/home。, 出力には変更されたURLが表示されます。

Output

Do not forget the final delimiter, or sed will complain. If you ran this command:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home'

この出力が表示されます。

Output
sed: -e expression #1, char 20: unterminated `s' command

いくつかの置換を練習するための新しいファイルを作成しましょう。 次のコマンドを実行して、song.txtという新しいテキストファイルを作成します。

  • echo "this is the song that never ends
  • yes, it goes on and on, my friend
  • some people started singing it
  • not knowing what it was
  • and they'll continue singing it forever
  • just because..." > song.txt

次に、式onforwardに置き換えましょう。 次のコマンドを使用します。

  • sed 's/on/forward/' song.txt

出力は次のようになります。

Output
this is the sforwardg that never endsyes, it goes forward and on, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

ここでいくつかの注目すべきことを見ることができます。, まず、それですsed単語ではなくパターンを置き換えました。 onsongforwardに変更されます。

気づくべきもう一つのことは、2行目で、第二のonforwardに変更されなかったことです。

これは、デフォルトでは、sコマンドが行の最初の一致を操作し、次の行に移動するためです。, sedのすべてのインスタンスを置き換えるにはon各行の最初のインスタンスではなく、オプションのフラグをsubstituteコマンドに渡す必要があります。

g置換セットの後に置くことによって、substituteコマンドにフラグを指定します。

  • sed 's/on/forward/g' song.txt

この出力が表示されます。

これで、substituteコマンドはすべてのインスタンスを変更します。,

sedが各行で見つけた”on”の二番目のインスタンスのみを変更したい場合は、2の代わりにg:

  • sed 's/on/forward/2' song.txt

今度は他の行は変更されません。

Output
this is the song that never endsyes, it goes on and forward, my friendsome people started singing itnot knowing what it wasand they'll continue singing it foreverjust because...

どの行が置換されたかだけを確認したい場合は、-nオプションを再度使用して自動印刷を抑制します。,

次に、pオプションをsubstituteコマンドに渡して、置換が行われた行を出力することができます。

  • sed -n 's/on/forward/2p' song.txt

変更された行が画面に表示されます。

Output
yes, it goes on and forward, my friend

ご覧のとおり、コマンドの最後にフラグを組み合わせることができます。

検索プロセスで大文字と小文字を無視する場合は、”i”フラグを渡すことができます。,

  • sed 's/SINGING/saying/i' song.txt

次の出力が表示されます。

Output
this is the song that never endsyes, it goes on and on, my friendsome people started saying itnot knowing what it wasand they'll continue saying it foreverjust because...

一致したテキストの置換と参照

正規表現でより複雑なパターンを見つけたい場合は、置換テキストで一致したパターンを参照するさまざまな方法があります。,

たとえば、行の先頭からatに一致するようにするには、次のコマンドを使用します。

  • sed 's/^.*at/REPLACED/' song.txt

この出力が表示されます。

Output
REPLACED never endsyes, it goes on and on, my friendsome people started singing itREPLACED it wasand they'll continue singing it foreverjust because...

ワイルドカード式が行の先頭から.

検索文字列で一致する正確なフレーズがわからないため、&文字を使用して、置換文字列内の一致したテキストを表すことができます。,

一致したテキストの周りにかっこを入れてみましょう。

  • sed 's/^.*at/(&)/' song.txt

この出力が表示されます。

Output
(this is the song that) never endsyes, it goes on and on, my friendsome people started singing it(not knowing what) it wasand they'll continue singing it foreverjust because...

一致したテキストを参照するより柔軟な方法は、エスケープされたかっこを使用して一致したテキストのセクションをグループ化することです。

括弧でマークされた検索テキストのすべてのグループは、エスケープされた参照番号で参照できます。 たとえば、最初の括弧グループは\1で参照でき、二番目の括弧グループは\2などで参照できます。,

この例では、各行の最初の二つの単語を切り替えます:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

この出力が表示されます:

Output
is this the song that never endsyes, goes it on and on, my friendpeople some started singing itknowing not what it wasthey and'll continue singing it foreverbecause just...

ご覧のとおり、結果は完璧ではありません。 たとえば、二番目の行は最初の単語をスキップします。 同様に、they'llを五行目の二つの単語として扱いました。

正規表現をより正確に改善しましょう。

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

この出力が表示されます。

Output
is this the song that never endsit yes, goes on and on, my friendpeople some started singing itknowing not what it wasthey'll and continue singing it foreverbecause... just

これは前回よりもはるかに優れています。, これは、関連する単語と句読点をグループ化します。

かっこ内で式を繰り返す方法に注意してください(*文字なしで一度、それと一緒に一度)。 これは、*文字が、その前に来る文字セットにゼロ回以上一致するためです。 これは、パターンが見つからなくても、ワイルドカードとの一致は”一致”と見なされることを意味します。

sedがテキストを少なくとも一度検出するようにするには、ワイルドカードを使用する前にワイルドカードなしで一度一致させる必要があります。,

結論

このチュートリアルでは、sedコマンドを検討しました。 ファイルから特定の行を印刷し、テキストを検索し、行を削除し、元のファイルを上書きし、正規表現を使用してテキストを置き換えました。 適切に構築されたsedコマンドを使用してテキスト文書をすばやく変換する方法をすでに確認できるはずです。

このシリーズの次の記事では、より高度な機能をいくつか紹介します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です