sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc
...huellas dactilares...
2015-01 6000
2015-02 8000
2015-03 10000
Así que arriba declaro una expresión regular que define una extensión de campo que consiste en una secuencia única de caracteres de *
longitud variable que ^
no son <espacio> seguida inmediatamente por una secuencia única de caracteres de *
longitud variable que son <espacio> . Esta declaración se aplica contra sed
el espacio del patrón, que es una cadena delimitada (por defecto) por cada \n
carácter de línea de línea que aparece en la entrada, y que se reemplaza recursivamente (por defecto) con el siguiente para cada aparición de la misma.
La interfaz para esta declaración es doble, y en cada nivel está completamente regulada y especificada por al menos un comité de estándares oficial internacional de IEEE para garantizar la aplicación predecible de la sed
sintaxis de comandos. sed
La sintaxis de API , por ejemplo, se aplica en este caso con el comando de /
dirección (que siempre es el primer componente de cualquier comando de sustitución) , pero el contenido del mismo es interpretado por una API más básica como un subconjunto del especificado para función en la biblioteca C estándar ./
sed s///
regcomp()
Puedo hacer estas declaraciones con confianza, porque sed
es no sólo un programa, sino, más bien, el compilado ejecutable llamado sed
en mi Unix máquina es una aplicación de la bien definida, históricamente establecida, y las normas controlado por sed
la aplicación de Regular- de mi sistema bibliotecas coincidentes de expresiones.
De la sed
especificación:
La sed
utilidad debe admitir los BRE descritos en XBD Basic Regular Expressions ...
... donde encontramos ...
Ambos BREs y EREs son soportados por la interfaz de Expresión Matching Regular en el volumen del sistema Interfaces de POSIX.1-2008 bajo regcomp()
, regexec()
y las funciones relacionadas.
Una aplicación que llama regcomp()
presentará una cadena de patrón y ...
... [l] a regcomp()
función compilará la expresión regular contenida en la cadena señalada por el argumento del patrón y colocará los resultados en la estructura preg ...
Para actuar sobre eso, dicha aplicación se referiría a regcomp()
la función complementaria de ...
... [l] a regexec()
función compara la cadena terminada en cero especificada por la cadena con la expresión regular compilada preg inicializado por una llamada previa a regcomp()
...
... regexec()
debe completar los elementos de [una] matriz con los desplazamientos de las subcadenas de cadena que corresponden a las \(
subexpresiones entre paréntesis \)
del patrón ... el patrón en sí mismo cuenta como una subexpresión ...
... [l] a regexec()
función debe completar todos los elementos nmatch de pmatch , donde la aplicación proporciona nmatch y pmatch , incluso si algunos elementos de pmatch no corresponden a subexpresiones en el patrón .
Y así cuando lo hago ...
/[^ ]* */
... sed
primero compila la expresión regular y almacena los resultados en la memoria, luego aplica el autómata compilado almacenado allí al contenido de mi espacio de patrones tantas veces como sea necesario para cumplir mi comando. Cada vez que lo hace, el resultado es una matriz de uno o más campos delimitados por nulos como delimitados en los desplazamientos devueltos por regexec()
.
Y cuando lo haga ...
//
... para indicar que se debe usar la expresión regular definida más recientemente, sed
simplemente puede llamar regexec()
nuevamente reutilizando la expresión regular precompilada, pero posiblemente aplicándola esta vez a un argumento de cadena cambiado o aplicando nuevos parámetros nmatch como comando.
Más específicamente aún ...
s/[^ ]* */[&]P/
- reemplace la primera aparición del patrón en el espacio del patrón con un
[
corchete izquierdo, luego en &
sí mismo, luego un ]
corchete derecho seguido de un P
carácter.
s//&+pc/3
- aplique la última expresión regular utilizada nuevamente al espacio de patrón actual y reemplace la
3
tercera aparición de patrón en el espacio de patrón con &
ella misma seguida de la cadena adjunta +pc
.
Y así, para cada línea de sed
entrada, escribe en su stdout, dados sus datos de ejemplo:
[2015-01 ]P5000 1000+pc
[2015-02 ]P6000 2000+pc
[2015-03 ]P7000 3000+pc
Esto puede parecer extraño, pero la dc
calculadora cita cadenas en su entrada entre corchetes, y el P
comando imprimirá la parte superior de la pila sin \n
agregar una línea e y luego la quitará de la pila de entrada.
Y así, usando la primera línea allí como ejemplo, dc
hará:
[2015-01 ]P
P
rint y pop la parte superior de la pila
5000
- Empuje el número
5000
en la parte superior de la pila y empuje todos los elementos actualmente en la pila (ahora ninguno) hacia abajo en uno.
1000
- lo mismo, pero esta vez el número 5000 en la parte superior de la pila principal es empujado hacia abajo por uno, y se convierte en el segundo elemento en la pila.
+
- Agregue los dos números superiores en la pila, saque ambos de la pila y empuje la suma hacia la parte superior de la pila.
- Esto da como resultado una pila que consta solo del número
6000
.
- Este es un error de sintaxis si alguno de los dos elementos superiores de la pila es una
[
cadena ]
.
p
p
rint la parte superior de la pila seguido de un \n
ewline adjunto sin sacarlo de la pila.
c