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

Unix Sed チュートリアル:6 つの実用的な例による複数行のファイル操作

以前の UNIX sed チュートリアル シリーズの一環として、印刷、削除、置換、ファイル書き込み、ファイル操作コマンドなど、パターン スペース内の 1 行で。

この記事では、Sed で複数行の操作を行う方法を確認します。

最初の sed チュートリアルで学んだ Sed の作業方法を覚えていますか?その記事では、Sed が行ごとに読み取り、末尾の新しい行を削除し、パターン スペース バッファーに行を配置し、指定されたコマンドに従って処理し、パターン スペースを出力することを説明しました。

念のため、ファイル内のすべての改行を削除したい場合、次の方法は使用できません。改行は既に削除され、パターン スペースに配置されているためです。

$ sed 's/\n//' filename or  $sed 's/\n/ENDOFLINE\n/' filename

このような状況では、sed 複数行が適切です。 Sed は、複数行操作用のコマンド「N」を提供します。

N コマンドは、入力から次の行を読み取り、次の行をパターン スペースに追加します。次の行は、元のパターン スペースから改行文字で区切られます。

最初に、以下で説明するすべての例で使用される geekstuff.txt ファイルを作成しましょう。

$ cat thegeekstuff.txt
Linux Sysadmin
Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc.
Security (Firewall, Network, Online Security etc)


Storage in Linux
Website Design
Website Design
Windows- Sysadmin, reboot etc.
$

注: 上記の入力には、2 つの連続する空白行があります。 (5行目と6行目)

Sed の例 1. 2 つの連続する行を結合する

$ sed -e '{
N
s/\n/ @ /
}' thegeekstuff.txt

Linux Sysadmin @ Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc. @ Security (Firewall, Network, Online Security etc)
 @
Storage in Linux @ Website Design
Website Design @ Windows- Sysadmin, reboot etc.

上記の例では、

  • コマンドをグループ化するために使用される中括弧「{」と「}」。中括弧と sed コマンドは別の行にある必要があります。
  • Sed は最初の行を読み取り、それをパターン スペースに配置します。N コマンドは次の行を読み取り、パターン スペース、つまり改行で区切られた最初の行を追加します。したがって、パターン スペースには最初の行\n2 番目の行があります。
  • 次に \n を space@space に置き換えると、パターン スペースの内容が sed のデフォルトの動作として出力されます。したがって、連続する行は「@」で結合され、区切られます

Sed の例 2. ファイルの空白でない各行に番号を付ける

前回の記事で述べたように、=はファイルの行番号を取得するコマンドです。

$ sed '/./=' thegeekstuff.txt | sed 'N; s/\n/ /'
1 Linux Sysadmin
2 Databases - Oracle, mySQL etc.
3 Databases - Oracle, mySQL etc.
4 Security (Firewall, Network, Online Security etc)

7 Storage in Linux
8 Website Design
9 Website Design
10 Windows- Sysadmin, reboot etc.
  • 最初の sed コマンドは行番号を出力し、空白でない場合は次の行に元の行を出力します (実行して最初の sed コマンドの出力を確認してください)。
  • 次の sed コマンドは、2 行を追加するだけです。

Sed の例 3. 入力から 2 つの連続する空白行を削除する

$ sed '/^$/{
N
/^\n$/d
}' thegeekstuff.txt
Linux Sysadmin
Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc.
Security (Firewall, Network, Online Security etc)
Storage in Linux
Website Design
Website Design
Windows- Sysadmin, reboot etc.

行が空白の場合、次の行を読み込んで追加します。/^\n$/ は、2 行が空白であることを表し、\n は N コマンドによって追加されます。次に、パターン スペースを削除し、コマンド「d」を使用して次のサイクルを開始します。

Sed の例 4. ファイルの最後の 2 行を削除

この例を見る前に、2 つの興味深い sed コマンドに注意してください。

<オール>
  • P – パターン スペースの最初の行を出力します。 (最初まで \n)
  • D – パターン スペースから最初の行を削除します。その後、制御はスクリプトの先頭に渡されます。
  • $ sed 'N;$!P;$!D;$d' thegeekstuff.txt
    Linux Sysadmin
    Databases - Oracle, mySQL etc.
    Databases - Oracle, mySQL etc.
    Security (Firewall, Network, Online Security etc)
    
    Storage in Linux
    Website Design
    <オール>
  • 最初の行を読み取り、パターン スペースに配置します。
  • N コマンドは次の行を読み取り、改行で区切られたパターン スペースに追加します。 (現在は 1 行目\n2 行目)
  • 最後の行 ($) に達していない場合は、最初の行を出力し、パターン スペースから最初の行だけを削除します。その後、サイクルが再開されます。
  • このように 2 行目\n3 行目、3 行目\n4 行目と結合して続きます。
  • 最後にパターン スペースの 9 行目\n10 行目で $ に達するので、パターン スペースを削除するだけです。 ($!P と $!D は、$ の場合、出力も削除もしません)。
  • Sed の例 5. ファイルの最後の 2 行を出力

    $ sed '$!N;$!D' thegeekstuff.txt
    Website Design
    Windows- Sysadmin, reboot etc.

    上記は、最後の 2 行がパターン スペースに存在するまで、各行を結合して削除します。 $ に到達すると、最後の 2 行のみを含むパターン スペースを出力します。

    Sed の例 6. ファイルから重複する連続した行を削除する

    以下のコマンドは、次の行と結合された各行をチェックし、両方が同じかどうかをチェックし、パターン スペース (!P) を印刷しません。パターン スペースから最初の行を削除するだけです。したがって、パターン スペースには 1 行だけが残ります。

    $ sed '$!N; /^\(.*\)\n\1$/!P; D' thegeekstuff.txt
    Linux Sysadmin
    Databases - Oracle, mySQL etc.
    Security (Firewall, Network, Online Security etc)
    
    Storage in Linux
    Website Design
    Windows- Sysadmin, reboot etc.

    Linux
    1. Linux /UNIXAwkコマンドチュートリアルと例

    2. Awk チュートリアル:3 つの実践例で Awk 変数を理解する

    3. 実際の例を含む Bash シェルの終了ステータスのチュートリアル

    1. 17Linuxでの実用的な例を含む便利なtarコマンド

    2. Linuxでの差分コマンドと例

    3. 初心者向けの例を含むmktempコマンドチュートリアル

    1. 初心者向けの例を含むGrepコマンドチュートリアル

    2. 完全なSedコマンドガイド[実際の例で説明]

    3. Linuxsedコマンドの使用例と例