パターン空間から最初の行を削除する移植可能な方法(複数行がある場合)

パターン空間から最初の行を削除する移植可能な方法(複数行がある場合)

パターン空間から最初の行1を
削除する移植可能な方法は何ですか?gnu sed私ができることで

s/[^\n]*\n//

しかし、私が知っている限り、これは(\n[]かっこ式で使用される)移植可能ではありません。


実際の例:ここでは、sed区切り文字を含むファイルの最後の部分が印刷されます。移植可能なコードを通して。区切り文字を除いて移植可能な方法で実行するために、パターン空間から最初の行を削除したいと思います。とてもgnu sed簡単です:

sed 'H;/===/h;$!d;//d;x;s/[^\n]*\n//' infile

1:明らかに、これはコマンドサイクルを再開せずに実行する必要があります...

答え1

このような操作を移植可能に実行する1つの方法は次のとおりです。

sed -e '
   # ... assuming prev sed cmds made pattern space carry newline(s)
   y/\n_/_\n/     ;# exchange newlines with an underscore
   s/^[^_]*_//    ;# remove up till the first underscore, ummm newline
   y/\n_/_\n/     ;# revert the transformation
' 

答え2

試してみるには適切なsedがありませんが、いつでも内部ループを実行して、改行文字に達するまで文字をテストして削除できます。

sed 'H
/===/h
$!d
//d
x
{
   :rpt
   s/^\n//
   t done
   s/.//
   t rpt
}
:done
'

2番目のテストブランチは、最後の読み取り以降に成功したことを示す内部フラグをリセットするためにaの代わりにaでなければなりませんt rpt。その必要はありません。単にループをよりよく見せるためのものです。tbs{}

答え3

愚かだが働いている:

sed 'h;G;s/\n/&&/;s/^\(.*\)\n\(.*\)\n\1\2$/\2/'

それは何ですか?内容全体を2倍にし、最初の改行文字を2つの改行文字に置き換えます。したがって、最初の行の後に追加の改行を使用して同じ内容を2回持っています。逆参照を使用すると、さまざまな部品を識別できます。

保持バッファを使用したくない場合:

sed 's/.*/&&/;s/\n/&&/;s/^\(.*\)\n\(.*\)\1\2$/\2/'

いいえ、それは嫌です。避ける方法がある場合は避けてください。

関連情報