Linuxコマンド.NETLinuxコマンド.NETLinuxコマンドを中心にIT技術関係の情報を発信します。Linuxコマンドについてはできるだけ実行例と実行結果を紹介したいと思います。Linuxコマンドsedコマンドは、主にテキストにある文字列を別の文字列に置換することによく使われます。テキスト編集などにとても便利なコマンドでぜひ覚えておきたいコマンドのひとつです。editor)の略で、入力ファイルやパイプラインで渡されたテキストを編集することができます。普通のエディタと違い、パイプライン渡されたテキストを編集できることが特徴です。ファイルにある特定の文字列を一括に編集できるのも利点といえるでしょう。sedコマンドの特徴としては、テキストの置換がありますが、そのほかにも文字列の挿入や削除なども行うことができます。その際に正規表現のグループ化やアドレスについて知っていると複雑なテキスト編集を行うことができます。パターンスペースやホールドスペースというsedコマンドの2つのバッファについて知っているとsedコマンドの処理についてより詳しくなり、さらに複雑なテキスト編集を行うことができます。他にもsedコマンドには条件分岐の処理や複数行の処理も行うことができます。条件分岐の処理を使いこなすことができれば、sedコマンドの置換コマンドであるsコマンドをよりうまく使うことができます。複数行の処理を行うことができれば、連続している複数行を一つの行にまとめる事等の処理を行うことができます。入力ファイルオプション:sedコマンドに対するオプションです。スクリプト:[addr]X[options]1[addr]X[options]で表現されます。スクリプトは以下のように記述することができます。addr:行の位置や範囲を示すもので、行番号や正規表現を用いて指定できます。X:sedコマンドの機能を決定する、一文字のことです。options:Xで指定したものによって必要なオプションのことです。入力ファイル:1個以上の入力ファイルを指定できます。sedコマンドに入力ファイルがないもしくは-(ハイフン)の場合は、標準出力に対して、sedコマンドのスクリプトを実行します。ファイル上から順に1つ目は入力がファイルがない場合です。2つ目は-(ハイフン)を用いた場合です。3つ目はリダイレクトによって、ファイルを標準入力としてsedコマンドに渡した場合です。それぞれsedコマンドで、標準出力に対して処理を行うという意味で同じになります。sedコマンドのファイルの保存方法についてsedコマンドの出力は、オプションがない場合、標準出力に現れます。sedコマンドの-iオプションをつけた場合、対象のファイルに対して出力を行います。ファイルに保存する方法として、一つは、リダイレクトを利用して別のファイルを作成し、その後にmvコマンドなどでtmp.txtをitemtext.txtに置き換える方法があります。itemtext.txtまた、-iオプションを用いて、直接ファイルを置き換えてしまう方法があります。sedで利用できます。-iオプションは、実際には一時ファイルが作られ、その一時ファイルに対してsedコマンドの出力が行われ、その一時ファイルの名前を対象のファイルとして置き換えます。itemtext.txtのように-iオプションの後に接尾辞を指定することでバックアップファイルを作成することができます。この例ではitemtext.txt.bakのような置き換える前のバックアップファイルを作成することができます。パターンマッチした文字列を別の文字列に変換(s/regexp/replacement/flags)s/regexp/replacement/flagsは、sedコマンドの主要な機能といえるものです。Expression)regexpにマッチしたものを別の文字列replacementに置き換えます。flagsは0個以上を指定することでき、flagsによって文字列の置き換え方などを変更することができます。最初にパターンマッチした文字列を置換(flags:なし)s/regexp/replacement/は、それぞれの行で最初に登場した文字列を別の文字列に置き換えます。コマンド例では、最初に登場したappleという文字列をmelonという文字列に置き換えます。yuzuそれぞれの行に現れるappleをすべて置き換えるわけではないので注意が必要です。すべてのパターンマッチした文字列を置換(flags:g)s/regexp/replacement/gはそれぞれの行に登場するすべての正規表現にマッチした文字列を別の文字列に置き換えることができます。コマンド例では、行に登場したすべてのappleをmelonに置き換えます。yuzun番目のパターンマッチした文字列を置換(flags:数字)s/regexp/replacement/1等のflagsに数字を入れたものは、n番目に登場したものだけを別の文字列に変更することができます。コマンド例では、2番目に登場したスペースを:に変更しています。yuzu:yuzu1番目のスペースを,に2番目に登場したスペースを:に変更する場合は以下のようにします。itemtext.txt実行結果apple,apple:appleapple,apple:onionapple,apple:yuzuapple,onion:appleapple,onion:onionapple,onion:yuzuapple,yuzu:appleapple,yuzu:onionapple,yuzu:yuzuonion,apple:appleonion,apple:oniononion,apple:yuzuonion,onion:appleonion,onion:oniononion,onion:yuzuonion,yuzu:appleonion,yuzu:oniononion,yuzu:yuzuyuzu,apple:appleyuzu,apple:onionyuzu,apple:yuzuyuzu,onion:appleyuzu,onion:onionyuzu,onion:yuzuyuzu,yuzu:appleyuzu,yuzu:onionyuzu,yuzu:yuzu-eオプションは、追加のスクリプトを記述することで変更することができます。-eオプションは記述された順番に処理されます。この例では、最初の-eオプションのスクリプトで1番目のスペースが,に変更されます。その次に変更された状態のテキストで、次の-eオプションのスクリプトで1番目のスペース(元ファイルの2番目のスペース)を:に変更しています。追加のスクリプトを記述する方法として;を用いて記述する方法もあります。以下のコマンド例でも上と同様の実行結果を得ることができます。flags:p)pフラグは変更があった行のみを表示します。-nオプションは、スクリプトで明示的に表示する行を除き、sedコマンドで出力する行を表示しないようにします。melonここで、-nオプションをつけない場合は、変更があった個所だけが重複して表示されてしまうことに注意が必要です。filename)wフラグはファイル名を指定することでそのファイルに変更があった行を書き込みます。ファイルがない場合は作成され、ある場合は上書きされます。変更があった行を別のファイルに保存したい場合に用いることができます。melonグループ化を用いて置換文字列にパターンマッチした文字列を使用グループ化とは、正規表現の特徴の一つでグループ化したパターンをキャプチャして、置換文字列で使うことができます。コマンド例では、それぞれの行に対して、最初の単語を最後の単語として追記します。apple」にします。yuzusedコマンドでの正規表現のグループ化は「\(」と「\)」で囲むことで行うことができ、その後に「\1」、「\2」のように呼び出すことができます。呼び出す数字に関して、「\(」が現れる順番で1から保存されます。この例では、最初の外側にある「\(」と「\)」は行の全体を表し「\1」で呼び出すことができます。次の内側にある「\(」と「\)」は最初の単語を表し「\2」で呼び出すことができます。この例のパターンは行全体を表して、行全体が置き換える対象になっています。sedコマンドで行全体を書き換えるようなイメージになっています。]」はスペース以外の文字を表し、「*」は直前の文字の0回以上繰り返しを示す記号になります。パターンスペースとホールドスペースsedコマンドは、基本的に入力行をバッファに入れます。space)といいます。sedコマンドは、パターンスペースとは別に補助的なバッファを持ちます。space)といいます。sedコマンドの基本動作は行ごとに、1.入力の行をパターンスペースに入れる。2.sedコマンドのスクリプトを実行する。(パターンスペースの変更や表示等)3.パターンスペースを表示する。(-nオプションがある場合は行わない)を繰り返します。sedコマンドのスクリプトのアドレスは一種の条件分岐のように扱うことができます。アドレスを用いることでパターンスペースとホールドスペースをうまく使うことができます。-nオプションについてsedコマンドは、デフォルトではスクリプトの最後にパターンスペースを自動的に表示します。-nオプションは、この自動表示をオフにします。パターンスペースは、スクリプトでpコマンド等を明示的に記述しない限り、表示されなくなります。目的によっては、デフォルトの自動表示が不必要になる場合があります。そんな時に、sedコマンドの-nオプションを覚えておくと便利です。スクリプトをファイルから読み込む(-fオプション)-fオプションは、sedコマンドのスクリプトが書かれたファイルを読み込むことができます。この例では、script.sedがsedコマンドのスクリプトが書かれたファイルになります。script.sedでは、sコマンドを用いてそれぞれの行で初めに現れた「apple」を「melon」に変えるスクリプトが書かれています。yuzusedコマンドのスクリプトのコメントについて、#の記号が利用できます。#置換します行の後の行にテキストを追記(aコマンド)aコマンドは行の後の行にテキストを追記することができます。yuzutext複数行のテキストを追記する場合は以下のようにします。yuzutext1text2text3(以下省略します)行の前の行にテキストを追記(iコマンド)iコマンドは行の前の行にテキストを追記することができます。yuzuまた、複数行のテキストを追記する場合は以下のようにします。yuzu(以下省略します)アドレスについてスクリプトは[addr]X[options]1[addr]X[options]で表現されます。addr:行の位置や範囲を示すもので、行番号や正規表現を用いて指定できます。X:sedコマンドの機能を決定する、一文字のことです。options:Xで指定したものによって必要なオプションのことです。ここでは、addr、つまりアドレスの指定方法についていくつか紹介します。アドレスを指定しないアドレスを指定しない場合、すべての行に対してコマンドを実行します。yuzutext数字で指定(num)コマンドの前に数字を記述するとその行番号の行に対して、コマンドを実行します。yuzu範囲で指定(num,num)アドレスを範囲で指定する場合は2つの数字をカンマで区切ります。コマンド例では1から5行目に対して、コマンドを実行することができます。yuzu最終行を指定($)最終行を指定する場合、$記号で指定することができます。yuzutext最初の行を指定する場合は、数字で1を指定することで最初の行を指定することができます。正規表現で指定(/regexp/または\%regexp%等)正規表現でアドレスを指定します。コマンド例ではappleという単語が含まれている行に対して、コマンドを実行します。yuzu正規表現で指定する場合、「/」の記号で囲むほかに「\」と「%」等のような一文字の記号を組み合わせても正規表現を行うことができます。別の記号を用いて正規表現を用いると場合によって、エスケープシーケンスを使うことを減らすことができます。text最後の例は一応アルファベットなどの記号も利用できるという例で、どこまでが区切りであるかがわかりにくいため、使用することを推奨しません。正規表現で範囲を指定(num,/regexp/)アドレスの範囲は数字と正規表現を組み合わせることでも作ることができます。数字と正規表現で範囲を作る際、0という数字を使うことができます。yuzu0,/regexp/と1,/regexp/は微妙に意味が違います。apple」にマッチした時点で範囲が終了します。apple」という行が登場するまで、コマンドの実行が行われます。このような点で0,/regexp/と1,/regexp/は異なります。アドレスの範囲の終端を相対的に指定(addr1,+num)範囲の始点から次のnum行までを指定することができます。コマンド例では、5行目から次の3行目、つまり8行目までを指定しています。yuzuアドレスをステップで指定(first~step)first行からstep行ずつを指定することができます。コマンド例では、5行目から3行ずつ行を指定しています。yuzu範囲の終端を行数の倍数で指定(addr1,~num)範囲の始点からnum行の倍数までの行を指定します。コマンド例では、5行目から4行目の倍数、つまりこの場合は8行目まで指定されます。yuzuアドレスで指定しなかったものを指定アドレスの最後に「!」をつけることで、アドレスで指定したものとは逆、つまり、アドレスで指定しなかったものを指定することができます。yuzutextアドレスで指定された行を別の文字列に置換(cコマンド)cコマンドは行を別の文字列に置換します。アドレスが指定されていない場合はそれぞれの行について、文字列を置換します。yuzu実行結果texttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttext範囲が指定されている場合は、それらの行を削除してから、文字列を置換します。yuzu!を用いて、アドレスの範囲の逆を指定すると、アドレス指定がある範囲でcコマンドでアドレスを指定しなかった時と同じような動作になります。yuzutexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttextcコマンドは実行された後にスクリプトがすぐに終了するため、その後にあるsedコマンドのスクリプトは実行されないことに注意しましょう。現在の入力行の行番号を表示(=コマンド)=コマンドは、入力行の行番号を表示することができます。yuzusedコマンドの-nオプションで余分な出力を除くと行番号のみを表示することができます。itemtext.txtscript.sed=1=実行結果123456789101112131415161718192021222324252627アドレスで正規表現を使うと、その正規表現とマッチする行の行番号を表示することもできます。itemtext.txtscript.sed/apple$/=1/apple$/=実行結果147101316192225のように表示させることができます。正規表現の$は行の終わりを示す記号になります。form)で表します。表示できない文字をC言語のエスケープ形式で示す。長い行は\の文字で区切る。それぞれの行の終端は$の記号で終了する。yuzu$UTF-8の場合で、日本語は8進数形式で表示されます。「あ」の場合だと「\343\201\202」のように表示されます。'l'実行結果\343\201\202$1\343\201\202$lコマンドの後に数字を入力するとその数字分の文字で行を折り返します。yuzu\yuzu$パターンスペースの内容をファイルに出力(wコマンド)wコマンドは、パターンスペースの内容をファイルに書き出すことができます。コマンド例では、itemtext.txtの3行目の内容を標準出力に出力します。yuzu/dev/stdoutを指定すると標準出力を指定することができます。ほかにも、/dev/stderrを指定すると標準エラー出力を指定することができます。ファイルから読み込んで内容を挿入(rコマンド)rコマンドは、指定したファイルの内容を次の行に挿入します。コマンド例では、itemtext.txtの3行目の次の行にファイルの内容を挿入しています。yuzu/dev/stdinを指定すると標準入力を指定することができます。補足として、rコマンドはファイルの内容を次の行に対して挿入するが、工夫を行えば、手前に対して挿入しているかのように動作させることができます。yuzuまず、初めのsedコマンドで最後の行にテキストを追記します。このテキストの追加は、次のsedコマンドでパターンスペースとホールドスペースを入れ替えるxコマンドを使って、行をずらして出力させるためです。行をずらして表示しますと最後の行が出力されません。そのために最後の行に対して追加で何かテキストを追加します。2つ目のsedコマンドを用いるとほとんど実行結果のように確認できます。上の行に空行ができます。これは最初のパターンスペースとホールドスペースの入れ替えにより、ホールドスペースの初期値が出力されるためです。ホールドスペースの初期値は何もないため、一番上の行に空行が表示されます。script.sedについて、「$q」を用いて、rコマンドで最後の行でファイルの内容を挿入させる前にsedコマンドのスクリプトを終了させます。qコマンドはsedコマンドのスクリプトは終了させるコマンドです。3つ目のsedコマンドで一番上にできた空行を削除します。すると上の実行結果のように出力されます。script.sedの「$q」を削除して、3つ目のsedコマンドで出力の最後の行を削除しても、同様の実行結果ができます。'1d;$d'スクリプトの複数コマンドを実行(-eオプション等)スクリプトの複数コマンドを記述するには、様々な方法があります。itemtext.txtの最初の行と最後の行を表示する例を出して、説明します。複数の-eオプションを使用することで、スクリプトの複数コマンドを記述することができます。スクリプトのコマンドは、-eオプションが記述された順番で実行されます。区切って記述スクリプトのコマンドを;で区切って記述することで複数のコマンドを実行させることができます。yuzuファイルに記述スクリプトをファイルに記述することで、複数のコマンドを実行させることができます。yuzu記述方法としては、;で複数のコマンドを記述したほうがタイピング量も見栄えも良いと思います。使い方によっては、ほかの方法も使用することがあると思います。-eオプションと-fオプションを同時に使用した場合の結果は以下の通りになります。yuzu-fオプションと-eオプションの順番を入れ替えた場合は以下の通りです。yuzuこの結果から、初めに呼ばれた-eオプションまたは-fオプションでのスクリプトを読み込み、その後に次の-eオプションまたは-fオプションでのスクリプトを読み込み、実行させることがわかります。文字の置換(yコマンド)yコマンドは、文字を別の文字に置換することができます。yコマンドは、y/変換前の文字/変換後の文字/で記述します。mllonパターンスペースを表示(pコマンド)pコマンドは、パターンスペースを表示することができます。使うコマンドのひとつです。appleパターンスペースを削除(dコマンド)dコマンドは、パターンスペースを削除することできます。dコマンドを使った場合、その後にスクリプトが続いていても、次のサイクルに移行します。dコマンドもよく使うコマンドのひとつです。appleスクリプトを終了(qコマンド)qコマンドは、スクリプトを終了させることができます。その後のスクリプトは実行されません。qコマンドの後にexitコードをつけることができます。yuzuexitコードをつけると、終了ステータスがそのexitコードになります。$?99パターンスペースを次の行に飛ばす(nコマンド)nコマンドは、sedコマンドに-nオプションがない場合は、現在のパターンスペースを表示して次のスクリプトのコマンドを実行します。-nオプションがある場合、パターンスペースが次の行になります。-nオプションがない例3の倍数の行をdeleteという単語に書き換える例です。oniondelete-nオプションがある場合の例3の倍数の行を表示する例です。yuzuコマンドをグループ化するコマンドのグループ化は、アドレスを指定して複数のコマンドを使用する場合に便利です。onionホールドスペースの利用sedコマンドでは、現在編集中の行をそれ以降の行でも使用したい場合にホールドスペースが利用できます。ホールドスペースというバッファは一つしか利用できないので注意が必要です。パターンスペースをホールドスペースへ(hコマンド)hコマンドは、パターンスペースの内容をホールドスペースにコピーできます。コピーする際、ホールドスペースが保存していた内容は削除されます。ホールドスペースに何かを保存した場合、gコマンド等でパターンスペースに呼び戻さないとホールドスペースの内容を使うことができません。コマンド例は次のgコマンドを参照してください。ホールドスペースをパターンスペースへ(gコマンド)gコマンドは、ホールドスペースの内容をパターンスペースにコピーできます。コピーする際、パターンスペースが保存していた内容は削除されます。コマンド例は、最初の1行目の内容をホールドスペースに保存します。onion」にマッチングした行で、そのマッチングした行の内容を表示した後に、ホールドスペースの内容を表示します。applescript.sedの3行目のコマンドのグループ化を利用しました。コマンドを別々にした場合、うまく動作しませんでした。onionアドレスでの正規表現はパターンスペースの内容を参照して、マッチングを行っているかもしれません。アドレスでの正規表現を用いる場合は、コマンドのグループ化を用いて呼び出したほうが良いと思います。パターンスペースをホールドスペースへ追記(Hコマンド)Hコマンドは、ホールドスペースの内容をパターンスペースに追記することができます。追記する際に、現在のホールドスペースの内容に改行を入れます。コマンド例は、1行目の内容をホールドスペースに保存し、2行目の内容をホールドスペースに追記します。onion」にマッチングした行で、そのマッチングした行の内容を表示した後に、ホールドスペースの内容を表示します。onionホールドスペースをパターンスペースへ追記(Gコマンド)Gコマンドは、ホールドスペースの内容をパターンスペースに追記することができます。追記する際に、現在のパターンスペースの内容に改行を入れます。コマンド例は、1行目の内容をホールドスペースに保存します。onion」にマッチングした行で、ホールドスペースの内容をパターンスペースに追記して、パターンスペースの内容を表示します。appleパターンスペースとホールドスペースを交換(xコマンド)xコマンドは、パターンスペースの内容とホールドスペースの内容を入れ替えることができます。apple」をホールドスペースに保存します。onion」表示します。apple」を表示します。onion条件分岐処理ラベルsedコマンドのスクリプトは、プログラミングのgoto文のようにスクリプトのコマンドのどこかにラベルをつけることができます。ラベルは:markや:labelのように、:と文字列でつけることができます。このラベルは、bコマンドやtコマンド等で使用することができます。ラベルの付け方は以下のようになります。mark無条件分岐(bコマンド)bコマンドは、無条件分岐のコマンドで、bコマンドで指定したラベルにジャンプします。bコマンドにラベルが何も指定していない場合、次のサイクルに移行します。コマンド例では、初めにappleのある行が削除され、それ以外の行が表示されます。yuzu条件分岐(tコマンド)tコマンドは、入力行が置換に成功していた場合、つまり、sコマンドが成功していた場合にラベルにジャンプします。tコマンドの条件が成り立つときにラベルが何も指定していない場合、次のサイクルに移行します。コマンド例は、appleの単語をすべて削除する例です。簡単な整形処理も行っています。yuzu逆に置換に成功していない場合、ラベルにジャンプするTコマンドもあります。マルチライン処理パターンスペースに次の入力行を追記(Nコマンド)Nコマンドは、パターンスペースに改行を追加し次の入力行を追記します。onionパターンスペースの最初の改行まで表示(Pコマンド)Pコマンドは、パターンスペースの最初の改行までを表示します。yuzu実行結果apple1appleパターンスペースの行を1行削除し、次のサイクルを実行(Dコマンド)Dコマンドは、改行までの行を1行削除して、残りのパターンスペースを残したまま次のサイクルを実行します。コマンド例は、行の最後の単語と次の行の最初の単語が同じ場合は、くっつけるようなイメージの例です。コメントをキャンセルメールアドレスが公開されることはありません。*次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。Linuxコマンド.NET.。