すべてを考慮すると、ファイル全体をゴブリングするのが最速の方法かもしれません。
基本的な構文は次のとおりです。
sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'
ファイルが非常に大きい場合、ファイル全体をゴブリングすることは選択肢にならないかもしれません。このような場合、ここで提供される他の回答は、小さなメモリフットプリントで動作することが保証されているカスタマイズされたソリューションを提供します。
他のすべてのハックとスラッシュの状況では、単に先頭に追加し、-e '1h;2,$H;$!d;g'
その後に元のsed
正規表現の引数が続くだけで、仕事はほぼ完了します。
例えば
$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat
何を-e '1h;2,$H;$!d;g'
するの?
1
、2,$
、$!
部品を直接次のコマンドがオン動作するライン限定ライン指定子あります。
1
:最初の行のみ
2,$
:2番目以降のすべての行
$!
:最後以外のすべての行
そのため、これがN行入力の各行で発生することです。
1: h, d
2: H, d
3: H, d
.
.
N-2: H, d
N-1: H, d
N: H, g
g
コマンドライン指定子を与えられていないが、前述のd
コマンドは、特別な条項を持っている「スタート次のサイクルを。」、これは防ぎg
最後を除くすべての行で実行されているから。
各コマンドの意味に関して:
- 最初
h
に続いてH
、各ラインのコピーのSは、に入力線前記sed
「sは空間を保持します。(任意のテキストバッファを考えてください。)
- その後、
d
各行を破棄して、これらの行が出力に書き込まれないようにします。ただし、ホールドスペースは保持されます。
- 最後に、最後の行で
g
、ホールドスペースからすべての行の累積を復元し、sed
入力全体に対して正規表現を実行できるようにします(一度に1行ずつではなく)。に一致し\n
ます。