GNU sed --posix e caractere de nova linha na string de substituição

GNU sed --posix e caractere de nova linha na string de substituição

Na sedespecificação POSIXesta afirmaçãodeve ser encontrado (grifo meu):

A sequência de escape '\n' deve corresponder a uma <nova linha> incorporada no espaço padrão.Um literal <newline> não deve ser usadono BRE de um endereço de contexto ouna função substituta.

O seguinte sedcomando GNU com --posixflag é contrário a essa especificação, porque uma nova linha é usada na função substituta.

$ printf '1X2' | sed --posix 's|X|\n|'
1
2

Então, por que sedinseriu uma nova linha em vez de exibir uma mensagem de erro?

Responder1

"Uma <nova linha> literal não deve ser usada", Não há nenhuma nova linha literal usada no seu exemplo. Portanto, esta parte da norma não é relevante.

\nénãouma nova linha literal.

Responder2

A --posixbandeira torna sedcompatível com GNU POSIX.

POSIX deixa o comportamento s/x/\n/indefinido:

O significado de uma <barra invertida> sem escape imediatamente seguida por qualquer caractere diferente de '&', <barra invertida>, um dígito, <nova linha> ou o caractere delimitador usado para este comando não é especificado.

Portanto, substituir xpor n, por \n, por nova linha, relatar um erro e reiniciar o computador são comportamentos compatíveis. Não há razão para que o GNU sedqueira mudar seu comportamento lá.

Uma conformidadeaplicativo(ou seja, script nesse caso) não deve ser usado \nlá, é disso que trata o texto que você cita.

É diferente s/[\t]/x/gonde o POSIX exige a substituição de ambos \e tpor x, e você verá o comportamento das sedmudanças do GNU --posixlá. Para s/[\n]/x/g, a especificação POSIX é realmente ambígua. GNU sedmuda seu comportamento com --posixpara substituir \e npor x, mas não está tão claro se é necessário ou não.

Responder3

A norma especifica que nopadrão de pesquisa(BRE, Basic Regular Expression, na linguagem POSIX) nenhuma nova linha explícita pode ser usada e uma nova linha é representada por '\n'; e não pode ser usado nosubstituiçãoqualquer.

Seu padrão de pesquisa não inclui novas linhas, explícitas ou representadas por '\n'. Você tem um '\n' na substituição. O texto acima não diz como uma nova linha deve ser representada (se for) no texto de substituição. GNU sed considera o anterior dizendo que substituir por '\n' significa introduzir uma nova linha. Sensível.

informação relacionada