はじめに
sed
コマンドは、ストリームエディタの略で、標準入力またはファイルからのテキストに対して編集操作を実行します。 sed
行ごとに非対話的な方法で編集します。
これは、コマンドを呼び出しているときにすべての編集決定を行い、sed
は指示を自動的に実行することを意味します。, これは混乱したり直感的ではないように見えるかもしれませんが、特にスクリプトや自動化されたワークフローの一部として、テキストを変換するため
このチュートリアルでは、いくつかの基本的な操作をカバーし、このエディタを操作するために必要な構文を紹介します。 通常のテキストエディタをsed
に置き換えることはほとんどありませんが、おそらくテキスト編集ツールボックスへの歓迎された追加
注:このチュートリアルでは、Ubuntuおよびその他のLinuxオペレーティングシステムにあるsed
のGNUバージョンを使用します。, MacOSを使用している場合は、異なるオプションと引数を持つBSDバージョンがあります。 GNUバージョンのsed
をbrew 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
sed
BSDライセンスファイルの内容を表示しましょう。 sed
デフォルトでは結果が画面に送信されます。, 次のコマンドを実行してみてください。
- sed '' BSD
BSDライセンスが画面に表示されます。
OutputCopyright (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 ''
ファイルの出力が表示されます。
OutputCopyright (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
ファイルの各行が表示されます。
OutputCopyright (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
OutputCopyright (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
最初の行が画面に表示されます。
OutputCopyright (c) The Regents of the University of California.
番号を配置することにより、1
印刷コマンドの前に、sed
操作する行番号を指定しました。
- sed -n '1,5p' BSD
この出力が表示されます:
OutputCopyright (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
sed
1行目から始まり、次の4行目でも操作するように指示したため、これは同じ出力になります。,他のすべての行を印刷する場合は、~
文字の後に間隔を指定します。 次のコマンドは、BSD
ファイル内の他のすべての行を1行目から出力します。
- sed -n '1~2p' BSD
出力は次のとおりです。
OutputCopyright (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
結果は、最後に与えられなかったすべての行を見ることになります。
OutputAll 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
以前に画面に表示されたのと同じ出力が表示されます。
OutputAll 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/index
とorg/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'
この出力が表示されます。
Outputsed: -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
次に、式on
をforward
に置き換えましょう。 次のコマンドを使用します。
- sed 's/on/forward/' song.txt
出力は次のようになります。
Outputthis 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
単語ではなくパターンを置き換えました。 on
内song
はforward
に変更されます。
気づくべきもう一つのことは、2行目で、第二のon
がforward
に変更されなかったことです。
これは、デフォルトでは、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
今度は他の行は変更されません。
Outputthis 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
変更された行が画面に表示されます。
Outputyes, it goes on and forward, my friend
ご覧のとおり、コマンドの最後にフラグを組み合わせることができます。
検索プロセスで大文字と小文字を無視する場合は、”i”フラグを渡すことができます。,
- sed 's/SINGING/saying/i' song.txt
次の出力が表示されます。
Outputthis 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コマンドを使用してテキスト文書をすばやく変換する方法をすでに確認できるはずです。
このシリーズの次の記事では、より高度な機能をいくつか紹介します。