sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
... imprime ...
2015-01 6000
2015-02 8000
2015-03 10000
Então, acima, declaro uma expressão regular que define uma extensão de campo que consiste em uma sequência única de caracteres de *tamanho variável que ^não é <espaço>, seguida imediatamente por uma sequência única de caracteres de *tamanho variável que é <espaço> . Essa declaração é aplicada ao sedespaço do padrão de, que é uma string delimitada (por padrão) por cada \ncaractere de linha de ew que ocorre na entrada e que é recursivamente substituída (por padrão) pelo próximo para cada ocorrência do mesmo.
A interface desta declaração é dupla e, em cada nível, é totalmente regulamentada e especificada por pelo menos um comitê oficial internacional de padrões do IEEE, para garantir a aplicação previsível da sedsintaxe de comando. sedA sintaxe da API , por exemplo, é aplicada neste caso com o comando /address (que é sempre o primeiro componente de qualquer comando ubstitution) , mas o conteúdo do mesmo é interpretado por uma API mais básica como um subconjunto do especificado para o comando função na biblioteca C padrão ./sed s///regcomp()
Eu posso fazer essas declarações com confiança, porque nãosed é apenas um programa, mas o executável compilado nomeado em minha máquina tipo Unix é uma implementação do aplicativo bem definido, estabelecido historicamente e controlado por padrões das aplicações regulares do meu sistema. bibliotecas correspondentes à expressão.sedsed
Das sedespecificações:
O sedutilitário deve suportar os BREs descritos em Expressões regulares básicas do XBD ...
... onde encontramos ...
Ambas as ERBs e EREs são suportados pela interface Expressão Matching regular no volume do sistema Interfaces de POSIX.1-2008 sob regcomp(), regexec()e funções relacionadas.
Um aplicativo que chama regcomp()apresentará uma sequência de padrões e ...
... [a] regcomp()função deve compilar a expressão regular contida na string apontada pelo argumento padrão e colocar os resultados na estrutura preg ...
Para agir sobre isso, o referido aplicativo se referiria à regcomp()função complementar de ...
... [a] regexec()função compara a string terminada em nulo especificada por string com a expressão regular compilada preg inicializada por uma chamada anterior para regcomp()...
... regexec()deve preencher os elementos de [uma] matriz com deslocamentos das substrings de string que correspondem às \(subexpressões entre parênteses \)do padrão ... o próprio padrão conta como subexpressão ...
... [a] regexec()função deve preencher todos os elementos nmatch de pmatch , onde nmatch e pmatch são fornecidos pelo aplicativo, mesmo que alguns elementos de pmatch não correspondam a subexpressões no padrão .
E então quando eu faço ...
/[^ ]* */
... sedprimeiro compila a expressão regular e armazena os resultados na memória e, em seguida, aplica o autômato compilado armazenado ali ao conteúdo do meu espaço de padrão quantas vezes for necessário para executar meu comando. Toda vez que o resultado é feito, há uma matriz de um ou mais campos delimitados por nulo, conforme delimitados nas compensações retornadas por regexec().
E quando eu faço ...
//
... para indicar que a expressão regular definida mais recentemente deve ser usada, sedbasta chamar regexec()novamente reutilizando a expressão regular pré-compilada, mas possivelmente aplicando-a desta vez a um argumento de string alterado ou aplicando novos parâmetros nmatch como eu comando.
Mais especificamente ainda ...
s/[^ ]* */[&]P/
- substitua a primeira ocorrência de padrão no espaço do padrão por um
[colchete esquerdo, depois &ele próprio, depois um ]colchete direito seguido de um Pcaractere.
s//&+pc/3
- aplique a última expressão regular usada novamente ao espaço padrão atual e substitua a
3terceira ocorrência de padrão no espaço padrão por &si mesma, seguida pela sequência anexada +pc.
E assim, para cada linha de sedentrada, ela grava em seu stdout, dados seus dados de exemplo:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Isso pode parecer estranho, mas a dccalculadora cita as seqüências de caracteres entre colchetes e o Pcomando imprime a parte superior da pilha sem anexar uma linha de \new e depois a retira da pilha de entrada.
E assim, usando a primeira linha lá como exemplo, dcfará:
[2015-01 ]P
PRint e pop no topo da pilha
5000
- Empurre o número
5000na parte superior da pilha e empurre todos os elementos atualmente na pilha (agora nenhum) para baixo em um.
1000
- idem, mas desta vez o número 5000 na parte superior da pilha principal é pressionado por um e se torna o segundo elemento na pilha.
+
- Adicione os dois números principais da pilha juntos, retire os dois da pilha e empurre a soma para o topo da pilha.
- Isso resulta em uma pilha que consiste apenas no número
6000.
- Este é um erro de sintaxe se um dos dois principais elementos da pilha for uma
[sequência ].
p
ppenteie o topo da pilha seguido por uma linha de e- \nmail anexada sem retirá-la da pilha.
c