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

Unix Sed チュートリアル :Sed ホールドとパターン バッファ操作の 7 つの例

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

以前の sed 記事では、sed 印刷、sed 削除、sed 代替、sed ファイル書き込み、sed 複数コマンド、sed 複数行操作、および sed 操作ファイル行について学びました。

sed チュートリアルの最初の部分で、sed には 2 つのバッファー (sed パターン バッファー) があることを学びました。 および sed ホールド バッファ .ここまでは、パターン バッファについてのみ説明してきました。

この記事では、7 つの実用的な sed の例を使用して、sed ホールドとパターン バッファの使用方法を確認します。 .

その名前が示すように、sed ホールド バッファ sed パターン スペースの全部または一部を保存するために使用されます その後の検索用。パターン スペースの内容をホールド スペースにコピーしてから、再度戻すことができます。ホールド スペースに対して直接実行される操作はありません。 sed は、これらの動きを処理するための hold および get 関数のセットを提供します。

Sed h 関数

h (ホールド) 関数は、パターン スペースの内容を保持領域 (sed ホールド スペース とも呼ばれます) にコピーします。 )、保持領域の以前の内容を破棄します。

Sed H 関数

H 関数は、パターン スペースの内容を保持領域の内容に追加します。前の内容と新しい内容は改行で区切られます。

Sed g 関数

g 関数は保持領域の内容をパターン空間にコピーし、パターン空間の以前の内容を破棄します。

Sed G 関数

G 関数は、保持領域の内容をパターン スペースの内容に追加します。前の内容と新しい内容は改行で区切られます。アドレスの最大数は 2 です。

Sed x 関数

交換機能は、パターン空間と保持領域の内容を交換します。アドレスの最大数は 2 です。

上記のコマンドについて学ぶために、いくつかの例を見てみましょう。

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

$ cat thegeekstuff.txt
#Linux
        Administration
        Scripting
        Tips and Tricks

#Windows
        Administration

#Database
        Mysql
        Oracle
        Queries
        Procedures

1. Sedコマンドを使用してファイルコンテンツをダブルスペース

$sed 'G' thegeekstuff.txt
#Linux

        Administration

        Scripting

        Tips and Tricks

#Windows

        Administration

#Database

        Mysql

        Oracle

        Queries

        Procedures 

$

この例では、

<オール>
  • Sed は 1 行を読み取り、それをパターン バッファに配置します。
  • G コマンドは、\n で区切られたホールド バッファをパターン バッファに追加します。そのため、パターン スペースの内容に 1 つの改行が追加されます。
  • 同様に、ファイルのスペースを 3 倍にしたい場合は、ホールド バッファの内容をパターン バッファに 2 回追加します。 (G;G)
  • 2. Sed コマンドを使用してファイルの内容を逆順に出力

    ファイルの行を逆順に出力します (前に説明した tac コマンドに似ています)。

    $sed -n '1!G;h;$p' thegeekstuff.txt
            Procedures
            Queries
            Oracle
            Mysql
    #Database
    
            Administration
    #Windows
    
            Tips and Tricks
            Scripting
            Administration
    #Linux

    この例では、

    <オール>
  • 1行目はそのままホールドスペースに入れます。
  • 2 行目以降は、ホールド スペースの内容にパターン スペースを追加するだけです。 (2 行目はパターン スペースにあり、1 行目はホールド スペースにあることに注意してください)。
  • これで 1 行目と 2 行目が逆になり、ホールド スペースに移動しました。
  • 最後の行まで上記の手順を繰り返します。
  • 最後の行に到達したら、ホールド スペースの内容をパターン スペースに追加し、パターン スペースを出力します。
  • 3. Sedコマンドを使用して段落を印刷します(特定のパターンが含まれている場合のみ)

    geekstuff.txt には、パターン「管理」が含まれている場合にのみ段落を印刷します。

    $ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d' thegeekstuff.txt 
    
    Linux
            Administration
            Scripting
            Tips and Tricks
    
    Windows
            Administration

    この例では、

    <オール>
  • 空行が来るまで、空行以外の行を保留スペースに追加し続けます
  • 空行、つまり段落の終了時に、パターンとホールド スペースの間でデータを交換します。そのため、段落全体がパターン スペースで使用可能になります。
    パターン「Administration」が使用可能かどうかを確認します。使用可能な場合は削除しないでください。つまり、パターン スペースを印刷します。
  • 4. Sed コマンドを使用してパターン マッチの直前の行を出力

    パターン「Mysql」の直前の行だけを出力します。

    $ sed -n '/Mysql/{g;1!p;};h' thegeekstuff.txt
    #Database

    この例では、

    <オール>
  • パターン「Mysql」と一致しない場合、サイクルごとにラインをホールド バッファに入れます。
  • 行がパターンと一致する場合、ホールド スペース (前の行) から g コマンドを使用してデータを取得し、出力します。
  • 念のため、最初の行がパターン「Mysql」と一致する場合、ホールド スペースは空になります (最初の行の前の行はありません)。そのため、最初の行は印刷されません (1!p)
  • 5. Sed コマンドを使用して各段落の最後の行を削除

    $ sed -n -e '/^$/{x;d}' -e '/./x;p' thegeekstuff.txt 
    
    #Linux
            Administration
            Scripting
    
    #Windows
    
    #Database
            Mysql
            Oracle
            Queries

    この例では、

    <オール>
  • 行が空でない場合は、パターンとホールド スペースの間で行を交換します。したがって、最初の行はホールド スペースに配置されます。
  • 次の空でない行が来たら、パターンスペースとホールドスペースを交換し、パターンスペースを出力します。つまり、最初の空でない行が出力され、2 行目が保持されます。そして次のサイクルでは、3 行目が保持され、このように続くと、2 行目の空でない行が出力されます。
  • 空行が来ると (空行の前の行がホールド バッファーで利用可能になります)、パターンを交換してスペースを保持し、行 (段落の最後の行) を削除して、次のサイクルを開始します。
  • 6.各行について、Sed コマンドを使用して前の行を最後に追加します

    $ sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/' thegeekstuff.txt
    #Linux
            Administration#Linux
            Scripting        Administration
            Tips and Tricks        Scripting
            Tips and Tricks
    #Windows
            Administration#Windows
            Administration
    #Database
            Mysql#Database
            Oracle        Mysql
            Queries Oracle
            Procedures                      Queries

    この例では、

    <オール>
  • 最初の行を保留バッファーに入れます。
  • 2 行目が来たら、ホールド スペース (1 行目) に追加します
  • 次に、パターンを交換してバッファーを保持します。したがって、パターン スペースには \n で区切られた 1 行目と 2 行目があり、ホールド スペースには 2 行目のみがあります。
  • パターン スペース内の行を入れ替えてください。
  • 上記の手順はファイルの最後まで行われます
  • 7.すべてのブロックのタグをそのブロックのすべての行に追加

    $ sed '
    /^#/{
    h
    d
    }
    G
    s/^\(.*\)\n#\(.*\)/\2 \1/' thegeekstuff.txt
    Linux         Administration
    Linux         Scripting
    Linux         Tips and Tricks
    Linux
    Windows         Administration
    Windows
    Database         Mysql
    Database        Oracle
    Database        Queries
    Database        Procedures

    この例では、

    <オール>
  • ブロックの最初の行 (# で始まる) に到達したとき
    • コマンド `h' を使用して、その行をホールド スペースに保持します
    • 次に「d」を使用して削除し、別のサイクルを開始します。
  • ブロックの残りの行については、コマンド「G」がホールド スペースからタグ行を追加し、代替コマンドがタグと行を適切に交換します。

  • Linux
    1. BashForループガイドと例

    2. Bash の For ループと While ループの例

    3. sedにおける「ホールド空間」と「パターン空間」の概念

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

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

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

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

    2. Linux which and whoami初心者向けコマンドチュートリアル(例付き)

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