一緒にsedを学ぶ(4)

awkと同様に、sedは行ごとにコマンドを実行します。操作が複数行に設計されている場合は、パラメーター「N」を使用して宣言する必要があります。
「N」は現在の操作の次の行を意味し、現在の行と次の行は1つの操作単位と見なされます。
たとえば、次のコマンドの結果を見てください。

sed '=;N' example.txt
# 1
# This is a test file.
# It is the last day of 2018.
# 3
# Hope all you success!
# HAPPY NEW YEAR!

その中で、「=」は行番号を表します。sedがコマンドを実行するときは、最初に1行目で実行し、行番号「1」を出力し、次に「N」を実行して、2行目と1行目を操作単位として出力します。2行目が操作されているためです。 、したがって、ここで「=; N」を実行すると、3行目から行番号「3」が出力され、3行目と4行目が出力されます。
上記の操作の順序を逆にした場合

 sed 'N;=' example.txt
# 2
# This is a test file.
# It is the last day of 2018.
# 4
# Hope all you success!
# HAPPY NEW YEAR

上記は、2つの行を1つの操作単位にマージしてから、行番号を出力するためのものです。行番号は2行目であることに注意してください。

上記は、奇数行などの偶数行の場合です。次に、次の行が見つからないため、最後の行でsedコマンドが終了します。

 sed '$a The last line!' example.txt | sed "N;="
# 2
# This is a test file.
# It is the last day of 2018.
# 4
# Hope all you success!
# HAPPY NEW YEAR!
# The last line!

最後の行が実行されたとき、次の行が見つからなかったため、次の「=」コマンドは実行されません。これには注意を払う必要があります。そうしないと、バグが簡単に発生します。

同様に、3行をオペレーティングユニットとして使用する場合は、2つの「N」を使用してそれを表すことができます。

sed '=;N;N' example.txt
# 1
# This is a test file.
# It is the last day of 2018.
# Hope all you success!
# 4
# HAPPY NEW YEAR!

アプリケーション:2行を1行に結合

たとえば、感嘆符で終わる2つの隣接する行をマージします。次のように書くことは可能ですか?

sed '/!$/s/\n//g' example.txt

最初に感嘆符で終わる行を見つけてから、行の後の行区切り記号「\ n」を削除してください。しかし、この方法は間違っています!sedは1行単位で処理されるため、行の行区切り記号を削除しても、sedは結果を1行に出力します。したがって、正しい記述は次のとおりです。

sed '/!$/{N;s/\n//g}' example.txt
# This is a test file.
# It is the last day of 2018.
# Hope all you success!HAPPY NEW YEAR!

拡張機能:sedキャッシュ

Sedには2種類のキャッシングがあります。1つはパターンバッファーで、もう1つはホールドバッファーです。パターンキャッシュは、現時点で選択して読み取る行です。一時キャッシュは、長期的なストレージスペースのようなものです。sedの実行中に、関連するコンテンツを一時キャッシュに保存できます。このキャッシュは、後続のsed実行のどこからでも呼び出すことができます。キャッシュ内のコンテンツ。これらの2つのキャッシュ操作に一般的に使用されるコマンドは次のとおりです。

h:モードバッファのコンテンツを一時バッファにコピーし、前の一時バッファのコンテンツを上書きします
。H:モードバッファのコンテンツを一時バッファに追加し、前の一時バッファのコンテンツを保持します
。g:残ります。キャッシュ内のコンテンツがモードバッファにコピーされ、現在のモードキャッシュ内のコンテンツが上書きされます
。G:一時キャッシュ内のコンテンツがモードバッファに追加され、現在のモードキャッシュ内のコンテンツが保持されます。
ただし、これらのキャッシュの概念の導入により、sedが複雑になりすぎます。理解するのが難しいので、詳しくは説明しません。これはほんの一例です。テキストのすべての行を逆の順序で出力します。

sed -n '1!G;h;$p' example.txt 
# HAPPY NEW YEAR!
# Hope all you success!
# It is the last day of 2018.
# This is a test file.

最初の行では、「!」を使用してGが実行されないことを示します。これは、この時点では一時バッファが空白であり、一時バッファをパターンバッファに追加する必要がないためです。追加しない場合は、空白行がもう1つあります。次に、hを実行してパターンを変更します。キャッシュ(この時点では最初の行のコンテンツ全体)が一時キャッシュに追加されます。「$ p」は、出力が最後の行で実行されることを意味するため、ここでは出力は実行されません。
2行目は、Gを実行して、(1行目が実行された後の)一時キャッシュをパターンキャッシュに追加します。このとき、パターンキャッシュは次のようになります。

It is the last day of 2018.
This is a test file.

次に、hを実行して上記のパターンキャッシュをコピーし、前の一時キャッシュを上書きします。このとき、一時キャッシュも次のようになります。

It is the last day of 2018.
This is a test file.

次に、次の他の行を順番に実行します。

最後の行で、一時バッファーのコンテンツを印刷し、テキストの逆行出力を完了します。
sedキャッシュにはさらに多くの操作がありますが、理解しにくいものもあります。

=====終わり====

参考資料:http//www.grymoire.com/Unix/Sed.html#uh-30

一緒にsedを学ぶ(4)

おすすめ

転載: blog.51cto.com/15069450/2577341