Por que o sed substitui globalmente apenas a primeira ocorrência em várias subseqüências?

1

Eu quero substituir globalmente todos os \n caracteres de nova linha pela sequência de escape \n e todos os caracteres ' de aspas simples com dois '' deles da seguinte forma:

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
}

Dado que o arquivo foobar.txt contém:

Foo's bar
Bar's foo

Apenas o primeiro caractere de aspas simples ' é duplicado.

A inversão da ordem das substituições esc_quot e esc_nl no comando sed para $esc_nl;$esc_quot funciona, ou seja, todos os caracteres ' de aspas simples são duplicados como esperado.

Por que isso acontece?

    
por Tim Friske 02.08.2014 / 13:10

1 resposta

1

Depois de me dedicar a Sed e particularmente tentar colocar minha cabeça em volta do comando N de Sed, eu criei o seguinte pequeno script Sed que funciona para mim:

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

A segunda variante do script Sed da minha pergunta tem o problema de deixar a última linha intocada se o número de linhas de entrada for estranho.

    
por 02.08.2014 / 22:59