Na presente edição
Stéphane Chazelas POSIXifies (novamente) o meu sed
formatação através da inserção de uma -e
pausa xpression e outra -e
declaração xpression. Agora, posso perguntar a ele por que, nos comentários, suponho, mas já é a revisão número 18 dessa resposta e quase todas as anteriores já eram graças a brindes semelhantes (se você puder ver comentários excluídos, saberá o que Quero dizer) . Além disso, acho que estou perto o suficiente para entender por que expressar isso de uma maneira que possa ser mais útil em geral. Então aqui está esperando ...
Geralmente, prefiro manter minhas sed
-e
impressões totais em um, se eu puder, mas também tenho uma preferência maior por estar em conformidade com as especificações o mais próximo possível, especialmente quando a diferença chega a não mais que um <space>
e um -e
. Mas não posso fazer isso se não entendo por que deveria. Aqui está um breve resumo do estado atual do meu entendimento:
a
' -e '
interrupção pode substituir portabilidade uma quebra de linha desed
script\n
em umased
instrução de linha de comando ... Eu sou confuso sobre o porquêa chave de fechamento em uma
sed
{
função}
deve ser precedida por uma\n
quebra de linha de linha, conforme indicado aqui:- O
<right-brace>
deve ser precedido por a<newline>
e pode ser precedido ou seguido por<blank>
caracteres.
- O
uma
\n
pausa ewline é igualmente necessário seguir qualquer uso de ...a
,b
,c
,i
,r
,t
,w
, ou:
.
Mas não entendo claramente como a definição de {
função }
se relaciona com o !
operador not. A única menção que encontro do operador de negação nos estados de especificação:
- Uma função pode ser precedida por um ou mais
!
caracteres; nesse caso, a função será aplicada se os endereços não selecionarem o espaço do padrão.
Isso significa que o uso de um !
implica {
aparelho }
? O que dizer dos $!
comandos - eles também devem ser separados por ' -e '
intervalos? Foi isso que foi abordado quando Stéphane mais recentemente POSIXificou minha resposta?
Eu acho que é o !
operador de negação ou a b
declaração do rancho que ele aborda em sua edição - ou possivelmente é ao mesmo tempo -, mas eu não sei e gostaria de fazê-lo. Se for apenas a b
declaração do rancho, acredito que um d
funcionaria em seu lugar e eliminaria a necessidade do ' -e '
intervalo, mas prefiro ter certeza antes de arriscar uma resposta três vezes POSIXificada . Você pode ajudar?
Afinal , arrisquei , mas não com muita certeza ...
:
papel - você dirigiu isso para casa meses atrás. Mas não entendo completamente por que o segundo sed
comando foi similarmente POSIXificado .
sed
é muito incerta para mim. Solicitei esclarecimentos algumas vezes no passado, mas acho que não foi atualizado como resultado. Um bom teste é tentar usar o baú da ferramenta de herança (Solaris one, derivado do original e no qual a especificação POSIX se baseia amplamente).
s///
as ubstitutions devem aceitar encadeamento com a ; . fica embaçado com os comandos que devem ser delimitados com uma nova linha e como -e
pode ficar nesse caso - pelo menos para mim. Ainda estou tropeçando em algo sed
que não os interpreta de maneira bastante intercambiável.
;
antes de uma nova linha - uma nova linha é boa. Honestamente, você poderia ficar sem o -e
e tudo inteiramente e apenas escrever um arquivo como #!/bin/sed
com cada comando em uma nova linha - ou aqueles que não requerem esses delimitadores, em vez disso, delimitados por ;
. Os que fazer exigem novas linhas são geralmente os que levam entrada arbitrária - :
nomes de rótulos e comandos que se referem a eles como b
ou t
ou fechar }
curlies para funções ou r
ead e w
rito que levam argumentos de nome de arquivo. Todos eles portàvelmente precisam ser seguidos por \n
.
b;n;:b
, você está ramificando para o rótulo chamado";n;:b"
seds históricos e POSIX (e o GNU sed não é nesse sentido).