sedが複数の交換が最初に発生した場合にのみグローバルに置き換えるのはなぜですか?

sedが複数の交換が最初に発生した場合にのみグローバルに置き換えるのはなぜですか?

次のように、すべての\n改行文字をエスケープシーケンスに置き換え、すべての単一引用符文字をそのうちの\n2つにグローバルに変更したいと思います。'''

function esc_foobar {
    # Escapes any "'" single quotation character.
    local -r esc_quot="s:':'':g"
    # Escapes any "\n" new line character.
    local -r esc_nl=':a;N;$!ba;s:\n:\\n:g'
    # Escape everything in one sed run.
    sed -- "$esc_quot;$esc_nl" foobar.txt
}

ファイルに以下が含まれていると仮定するとfoobar.txt

Foo's bar
Bar's foo

最初の一'重引用符文字だけが2倍になります。

コマンドと置換の順序を変更するとesc_quot機能します。つまり、すべての一重引用符文字が期待どおりに2倍になります。esc_nlsed$esc_nl;$esc_quot'

なぜですか?

答え1

Sedを詳しく見て、具体的にSedのNコマンドを理解しようとした後、私に適した以下の小さなSedスクリプトを考えました。

sed -- '$!N;s:\n:\\n:g;'"s:':'':g"

私の質問のSedスクリプトの2番目のバリエーションには、入力が奇数行の場合、最後の行を変更せずにそのままにする問題があります。

関連情報