![GNU sed --posix e caractere de nova linha na string de substituição](https://rvso.com/image/168813/GNU%20sed%20--posix%20e%20caractere%20de%20nova%20linha%20na%20string%20de%20substitui%C3%A7%C3%A3o.png)
Na sed
especificaçã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 sed
comando GNU com --posix
flag é 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 sed
inseriu 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 --posix
bandeira torna sed
compatí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 x
por 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 sed
queira mudar seu comportamento lá.
Uma conformidadeaplicativo(ou seja, script nesse caso) não deve ser usado \n
lá, é disso que trata o texto que você cita.
É diferente s/[\t]/x/g
onde o POSIX exige a substituição de ambos \
e t
por x
, e você verá o comportamento das sed
mudanças do GNU --posix
lá. Para s/[\n]/x/g
, a especificação POSIX é realmente ambígua. GNU sed
muda seu comportamento com --posix
para substituir \
e n
por 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.