GNU/Linux >> Linux の 問題 >  >> Linux

Unix Sed チュートリアル:Sed 分岐操作の 6 つの例

この記事は、進行中の Unix Sed Tips and Tricks シリーズの一部です。

他のプログラミング言語と同様に、sed には、プログラムの流れを制御するための特別な分岐コマンドも用意されています。

この記事では、次の 2 種類の Sed 分岐を確認します。

<オール>
  • Sed 無条件分岐
  • Sed 条件分岐
  • Sed 無条件分岐構文:

    $ sed ':label command(s) b label'
    • :label – ラベルの指定
    • commands – 任意の sed コマンド
    • label – ラベルの任意の名前
    • b ラベル – 条件をチェックせずにラベルにジャンプします。ラベルが指定されていない場合は、スクリプトの最後にジャンプします。

    Sed 条件分岐構文:

    $ sed ':label command(s) t label'
    • :label – ラベルの指定
    • commands – 任意の sed コマンド
    • label – ラベルの任意の名前
    • ラベル – 最後の代替コマンドがパターン スペースを変更した場合にのみ、ラベルにジャンプします。ラベルが指定されていない場合は、スクリプトの最後にジャンプします。

    サンプル テスト ファイルを作成する

    まず、以下の例で使用する geekstuff.txt ファイルを作成しましょう。

    $ cat thegeekstuff.txt
    Linux
            Administration
            Scripting
                    Tips and Tricks
    Windows
            Administration
    Database
            Administration of Oracle
            Administration of Mysql
    Security
            Network
                     Online\
            Security
    Productivity
            Google Search\
            Tips
            "Web Based Time Tracking,
            Web Based Todo list and
            Reduce Key Stores etc"
    $

    I.無条件分岐の Sed の例

    Sed の例 1. ファイル全体で最初に出現するパターンを置換

    ファイル thegeekstuff.txt で、最初に出現する「Administration」を「Supervision」に置き換えます。

    $ sed '/Administration/{
     s/Administration/Supervision/
     :loop
     n
     b loop
     }' thegeekstuff.txt
    Linux
    	Supervision
            Scripting
                    Tips and Tricks
    Windows
            Administration
    Database
            Administration of Oracle
            Administration of Mysql
    Security
            Network
                     Online\
            Security
    Productivity
            Google Search\
            Tips
            "Web Based Time Tracking,
            Web Based Todo list and
            Reduce Key Stores etc"
    <オール>
  • 上記の sed コマンドでは、1 行ずつ読み取り、管理が行われるまでパターン スペースを出力します。
  • 管理が発生したら、管理を監督に置き換えます (1 回のみ発生します。代わりに「g」フラグがないことに注意してください)。
  • 最初に出現したファイルを置き換えたら、残りのファイルの内容を読み取って出力します。
    • 「n」は、パターン スペースを出力して次の行で上書きする sed コマンドです。
    • ラベルとして「ループ」を使用。 「n」は現在の行を出力し、次の行でパターン スペースを上書きします。 b loop は再び :loop にジャンプします。したがって、このループは thegeekstuff.txt の残りの内容を出力します。
  • Sed の例 2. ファイル全体でパターン ” ” の間のデータを削除する

    サンプル ファイルでは、「」の間に 3 行あります。

    sed -e ':loop
    $!{
    N
    /\n$/!b loop
    }
    s/\"[^\"]*\"//g' thegeekstuff.txt
    Linux
            Administration
            Scripting
                    Tips and Tricks
    Windows
            Administration
    Database
            Administration of Oracle
            Administration of Mysql
    Security
            Network
                     Online\
            Security
    Productivity
            Google Search\
            Tips
    $
    <オール>
  • 上記のコマンド keep は、ファイルの終わりまでファイルのすべての行を追加します。
    • $! – ファイルの終わりでない場合
    • N – \n で区切られたパターン スペースで次の行を追加します
    • /\n$/!b ループ – これがファイルの最後の行でない場合は、再びループにジャンプします。
  • 改行で区切られたパターンスペースですべての行が利用可能になります。 ” の間のすべてのデータを空に置き換えます。
  • Sed の例 3. ファイルの HTML タグを削除する

    たとえば、次の html コンテンツを含むファイルがあるとします

    $ cat index.html
    <html><body>
    <table
    border=2><tr><td valign=top
    align=right>1.</td>
    <td>Line 1 Column 2</
    td>
    </table>
    </body></html>

    次の sed コマンドは、指定されたファイルからすべての html タグを削除します

    $ sed '/</{
    :loop
    s/<[^<]*>//g
    /</{
    N
    b loop
    }
    }' index.html
    
    1.
    Line 1 Column 2
    <オール>
  • 「<」を含む行を見つけるたびに、まずその行のすべての HTML タグを削除します。
  • パターンスペースに「<」が含まれている場合、これは複数行のタグを意味します。次のループを繰り返します:
    • 次の行に参加
    • 単一の「<」がなくなるまで、すべての HTML タグを削除します
  • パターン スペースに「<」が存在しない場合は、それを出力して新しいサイクルを開始します。
  • II.条件分岐の Sed の例

    Sed の例 4。行がバックスラッシュで終わっている場合、次の行をそれに追加します。

    サンプル ファイルにはバックスラッシュで終わる 2 行があり、次の行をそれに追加する必要があります。

    $ sed '
    :loop
    /\\$/N
    s/\\\n */ /
    t loop' thegeekstuff.txt
    Linux
            Administration
            Scripting
                    Tips and Tricks
    Windows
            Administration
    Database
            Administration of Oracle
            Administration of Mysql
    Security
            Network
                     Online Security
    Productivity
            Google Search Tips
            "Web Based Time Tracking,
            Web Based Todo list and
            Reduce Key Stores etc"
    <オール>
  • 行がバックスラッシュ (/\\$/) で終わっているかどうかを確認し、そうであれば、次の行を読み取ってパターン スペースに追加し、行末の \ とそれに続くスペースの数を置き換えます。
  • 置換が成功した場合は、上記の手順を繰り返します。分岐は、置換が成功した場合にのみ実行されます。
  • 主に再帰パターンに使用される条件分岐
  • Sed の例 5. 数値文字列を圧縮します。

     sed '
     :loop
     s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/
     t loop'
    12342342342343434
    12,342,342,342,343,434
    <オール>
  • 数字を 2 つのグループにグループ化します。
  • 最初のグループは、下 3 桁までのすべての数字です。最後の 3 桁は、2 番目のグループでキャプチャされます。
  • 次に、一致する 2 つのグループがカンマで区切られます。次に、すべての数字が 3 つのグループにグループ化されるまで、同じルールが何度も線に適用されます。
  • たとえば、最初の反復では 12342342342343,434 になります
  • 次の反復では 12342342342,343,434 となり、3 桁未満になるまで続きます。
  • Sed の例 6. 書式設定:行の先頭のスペースをすべて「+」に置き換えます

    $ sed '
    s/^ */&\n/
    :loop
    s/^\n//;s/ \n/\n+/
    t loop' test
    Linux
    ++++++++Administration
    ++++++++Scripting
    ++++++++++++++++Tips and Tricks
    Windows
    ++++++++Administration
    Database
    ++++++++Administration of Oracle
    ++++++++Administration of Mysql
    Security
    ++++++++Network
    +++++++++++++++++Online\
    ++++++++Security
    Productivity
    ++++++++Google Search\
    ++++++++Tips
    ++++++++"Web Based Time Tracking,
    ++++++++Web Based Todo list and
    ++++++++Reduce Key Stores etc"
    <オール>
  • 行頭のスペースやその他の文字はすべて改行文字で区切ります。
  • スペースと改行を改行と + に置き換えます。したがって、右から左へのスペースは + に置き換えられ、改行は 1 文字分左に移動されます。
  • 最後に行頭に \n があるので、その新しい行を削除してください。

  • Linux
    1. 初心者向けのLinuxcdコマンドチュートリアル(8例)

    2. 初心者向けのLinux通信コマンドチュートリアル(5例)

    3. 初心者向けのLinux日付コマンドチュートリアル(8例)

    1. 初心者向けのLinuxdfコマンドチュートリアル(8例)

    2. 初心者向けのLinuxduコマンドチュートリアル(10例)

    3. 初心者向けのLinuxechoコマンドチュートリアル(5つの例)

    1. 初心者向けのLinuxenvコマンドチュートリアル(5つの例)

    2. 初心者向けのLinuxサイズのコマンドチュートリアル(6つの例)

    3. 初心者向けのLinuxkillコマンドチュートリアル(5つの例)