FreeBSD 11.2 p7に付属のsedは、以下を提供します。
$ seq 10 | sed 'N; l; D; p'
1$
2$
2$
3$
3$
4$
4$
5$
5$
6$
6$
7$
7$
8$
8$
9$
9$
10$
gsed(GNU sed 4.7) は同じスクリプトを提供します。
$ seq 10 | gsed 'N; l; D; p'
1\n2$
2\n3$
3\n4$
4\n5$
5\n6$
6\n7$
7\n8$
8\n9$
9\n10$
10
これらの行動の違いをどのように説明できますか?
答え1
BSDは、視覚的に明確な形式で文字を出力するためにsed
使用される場合、視覚的l
に明確な形式で改行を出力しません。
~からsed(1)OpenBSDから:
[2addr]l
(The letter ell.) Write the pattern space to the standard output
in a visually unambiguous form. This form is as follows:
backslash \\
alert \a
backspace \b
form-feed \f
carriage-return \r
tab \t
vertical tab \v
(改行文字への言及はありません。)
ただし、GNUはsed
明示的な表示のために文字セットに改行文字を含めます。文字セットの拡張でこれを行います。POSIX規格sed
言及されました(これはBSDで使用されるコレクションですsed
)。 GNUは、コマンドラインで使用してsed
も--posix
このように動作します。
GNUはsed
また10
2回出力しますが、BSDはsed
そうではありません。 setまたはwithを使用してGNUをsed
実行すると、BSDのように一度だけ出力されます。POSIXLY_CORRECT
--posix
10
sed
これは、GNUがsed
デフォルトでコマンドのPOSIX定義部分を無視するためですsed
N
。
次の入力行が利用できない場合、
N
コマンド動詞はスクリプトの最後に分岐して新しいループを開始するか、パターンスペースを標準出力にコピーせずに終了する必要があります。
また、新しいループが開始されるため、プログラムはp
実行されません。sed
D