O comportamento dos utilitários de shell diferem de maneiras menores entre as variantes unix. Existem muitas variantes unix , com um complexo histórico . Existem esforços de padronização como o POSIX e seu superconjunto especificação Single UNIX . Atualmente, a maioria dos sistemas implementa o POSIX: 2001, também conhecido como Single UNIX Specification versão 3 , com pequenos desvios e muitas extensões. A especificação Unix única não é um tutorial, mas a versão 3 é legível se você já tiver uma ideia do que um comando está fazendo. Você pode consultá-lo para saber se algum recurso é padrão ou uma extensão de um sistema específico.
A maioria dos usuários unix usa o Linux e não usou nenhuma outra variante. O Linux vem com os utilitários GNU , que muitas vezes têm muitas extensões para o padrão. Então você encontrará um monte de código lá fora, que funciona no Linux, mas não em outros unices, porque depende dessas extensões.
Em relação ao sed, consulte a especificação única do sed para o mínimo que todo sistema deve ter para apoiar, a página do manual em seu sistema para o que sua implementação suporta, e o manual do GNU sed para o que a maioria das pessoas usa.
Uma das extensões fora do padrão no GNU sed é o suporte a vários comandos executados juntos. Por exemplo, este programa GNU sed imprime todas as linhas contendo a
, mas altera b
para c
first:
sed -ne '/a/ {s/b/c/g; p}'
{
e }
são, na verdade, comandos separados, portanto, para total portabilidade, é necessário especificá-los em linhas separadas (em um arquivo) ou em argumentos -e
separados (na linha de comando). A falta de um separador de comando após {
e o uso de ;
como um separador de comando são extensões comuns. A falta de um separador de comando antes de }
é uma extensão menos comum. Isto é compatível com os padrões:
sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'
Isso é fora do padrão, mas comumente aceito:
sed -ne '/a/ { s/b/c/g; p; }'
Outra extensão não padrão, porém comum, é o uso de \n
para significar uma nova linha em um texto de substituição s
(o uso em um regexp é padrão). O método portátil é incluir a barra invertida-newline no script sed. Outra extensão comum é \+
, \?
e \|
em regexps para significar um ou mais, no máximo um e alternação; As expressões regulares básicas portáteis não possuem nenhuma delas. Por exemplo, o primeiro comando é uma maneira não portátil de substituir sequências contíguas de espaços em branco por uma nova linha; o segundo comando é equivalente aos padrões.
sed -e 's/ \+/\n/'
sed -e 's/ */\
/'