以前の 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 コマンドに注意してください。
<オール>$ 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<オール>
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.