为什么 sed 全局仅替换多个替换中的第一个出现?

为什么 sed 全局仅替换多个替换中的第一个出现?

我想用转义序列全局替换所有\n换行符\n,用其中两个字符替换所有'单引号字符,''如下所示:

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

只有第一个'单引号字符会加倍。

颠倒命令中的esc_quot和替换的顺序即可起作用,即所有单引号字符都按预期加倍。esc_nlsed$esc_nl;$esc_quot'

为什么会这样呢?

答案1

在深入研究 Sed 并特别尝试了解 Sed 的N命令后,我想出了以下适合我的 Sed 小脚本:

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

我的问题中 Sed 脚本的第二个变体存在这样的问题:如果输入的行数恰好是奇数,它会保持最后一行不变。

相关内容