この記事は、進行中の 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」を使用して削除し、別のサイクルを開始します。