BSD sedとgsedの改行

BSD sedとgsedの改行

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また102回出力しますが、BSDはsedそうではありません。 setまたはwithを使用してGNUをsed実行すると、BSDのように一度だけ出力されます。POSIXLY_CORRECT--posix10sed

これは、GNUがsedデフォルトでコマンドのPOSIX定義部分を無視するためですsed N

次の入力行が利用できない場合、Nコマンド動詞はスクリプトの最後に分岐して新しいループを開始するか、パターンスペースを標準出力にコピーせずに終了する必要があります。

また、新しいループが開始されるため、プログラムはp実行されません。sedD

おすすめ記事