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 sed
espaço do padrão de, que é uma string delimitada (por padrão) por cada \n
caractere 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 sed
sintaxe de comando. sed
A 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.sed
sed
Das sed
especificações:
O sed
utilitá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 ...
/[^ ]* */
... sed
primeiro 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, sed
basta 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 P
caractere.
s//&+pc/3
- aplique a última expressão regular usada novamente ao espaço padrão atual e substitua a
3
terceira 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 sed
entrada, 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 dc
calculadora cita as seqüências de caracteres entre colchetes e o P
comando imprime a parte superior da pilha sem anexar uma linha de \n
ew e depois a retira da pilha de entrada.
E assim, usando a primeira linha lá como exemplo, dc
fará:
[2015-01 ]P
P
Rint e pop no topo da pilha
5000
- Empurre o número
5000
na 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
p
penteie o topo da pilha seguido por uma linha de e- \n
mail anexada sem retirá-la da pilha.
c