この記事は、進行中の 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 $
この例では、
<オール>2. Sed コマンドを使用してファイルの内容を逆順に出力
ファイルの行を逆順に出力します (前に説明した tac コマンドに似ています)。
$sed -n '1!G;h;$p' thegeekstuff.txt Procedures Queries Oracle Mysql #Database Administration #Windows Tips and Tricks Scripting Administration #Linux
この例では、
<オール>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
この例では、
<オール>5. Sed コマンドを使用して各段落の最後の行を削除
$ sed -n -e '/^$/{x;d}' -e '/./x;p' thegeekstuff.txt #Linux Administration Scripting #Windows #Database Mysql Oracle Queries
この例では、
<オール>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
この例では、
<オール>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」を使用して削除し、別のサイクルを開始します。