sed パターン空間とホールド空間

sed パターン空間とホールド空間

今このようなことを経験したのに理解できません。

sed -n '1h; 1!H; ${ g; s/foo\nbar/bla\nblub/ p }' file.

猫ファイルはどこにありますか?

 foo
 foo
 bar

なぜこれが起こるのでしょうか?1!H私は1hパターン空間を上書きして1!H何の役にも立たないからです。

しかし、sed onelinerはうまくいくようです。

ベストアンサー1

バラより@manatworkからの返信実用的な理由が1h;1!Hありますが、移植性に関するメモを追加したいと思います。

標準および移植可能な構文は次のとおりです。

sed -n '1h; 1!H; ${ g; s/foo\nbar/bla\
blub/p;}'

sedそれ以外の場合、従来のUnix実装など、ほとんどの実装では機能しません。

これは\nコマンドの左側で理解できますが、s右側ではバックスラッシュ文字を使用し、その後に実際の改行文字が続く必要があります。また、;コマンドとの間にスペースを含める必要があり、その前にスペースを含めないでください。s}p

予約済みスペースの代わりにパターンスペースにファイルの内容を保存することもできます。

sed -n '
  :1
  $!{
   N;b1
  }
  s/foo\nbar/blah\
blup/p'

ただし、モードとストレージの場合、ほとんどのsed非GNU実装にはこれらのファイルサイズに制限があるため、ほとんどの実装では小さなファイルしか処理できません(POSIXでは8kiBのデータのみを保存できるはずです)。

移植性を持たせるには、以下を使用することをお勧めしますperl

perl -0777 -ne 'print if s/foo\nbar/blah\nblup/'

perlGNUのサイズは制限されませんがsed、各プロセスのメモリ使用量に制限を設定しないと、システムメモリがすべて使用されるため、システムのパフォーマンスに影響を与える可能性があることに注意してください。

おすすめ記事