En esta edición,
Stéphane Chazelas POSIXifica (nuevamente) mi sed
formato insertando un -e
salto de expresión y otra -e
declaración de expresión. Ahora, podría preguntarle por qué en los comentarios, supongo, pero ya es la revisión número 18 en esa respuesta y casi todas las anteriores ya fueron gracias a regalos similares (si puede ver comentarios eliminados, sabrá qué me refiero) . Además, creo que estoy lo suficientemente cerca como para entender por qué expresar esto de una manera que podría ser más útil en general. Así que aquí está esperando ...
En general, prefiero mantener mi sed
-e
xpressions total en uno si pudiera, pero también tengo una mayor preferencia por cumplir con la especificación lo más cerca posible, especialmente cuando la diferencia no es más que ay <space>
an -e
. Pero no puedo hacer esto si no entiendo por qué debería hacerlo. Aquí hay un breve resumen del estado actual de mi comprensión:
la
' -e '
ruptura puede representar portátilmente unased
secuencia de comandos\n
ewline break en unased
declaración de línea de comando ... Estoy ciertamente confuso sobre por quéla llave de cierre en una
sed
{
función}
debe estar precedida por un\n
salto de línea de conexión como se indica aquí:- El
<right-brace>
debe ir precedido de a<newline>
y puede ir precedido o seguido de<blank>
caracteres.
- El
una
\n
ruptura ewline se requiere de manera similar después de cualquier uso de ...a
,b
,c
,i
,r
,t
,w
, o:
.
Pero no entiendo claramente cómo la definición de la {
función }
se relaciona con el !
operador no. La única mención que encuentro del operador de negación en los estados de especificación:
- Una función puede estar precedida por uno o más
!
caracteres, en cuyo caso la función se aplicará si las direcciones no seleccionan el espacio del patrón.
¿Significa esto que el uso de a !
implica {
llaves }
? ¿Qué pasa con los $!
comandos? ¿Deberían también estar separados por ' -e '
saltos? ¿Fue esto lo que se abordó cuando Stéphane más recientemente POSIXificó mi respuesta?
Creo que es el !
operador de negación o la b
declaración de rancho que aborda en su edición, o posiblemente ambas cosas a la vez, pero no lo sé y me gustaría. Si es solamente la b
declaración de hacienda, entonces creo un d
haría en su lugar y eliminar la necesidad de la ' -e '
ruptura, pero yo prefiero estar seguro antes de arriesgar un tres veces POSIXified respuesta. ¿Puede usted ayudar?
Lo arriesgué después de todo , pero no con mucha certeza ...
:
papel - condujiste a casa hace meses. Pero no entiendo completamente por qué el segundo sed
comando se POSIXificó de manera similar .
sed
está muy clara para mí. He solicitado aclaraciones varias veces en el pasado, pero no creo que se haya actualizado como resultado. Una buena prueba es probar con el hecheloom toolchest (uno de Solaris, derivado del original y en el que se basa en gran medida la especificación POSIX).
s///
sustituciones están especificadas para aceptar el encadenamiento con a ; . se vuelve borroso alrededor de los comandos que deben delimitarse con una nueva línea y cómo -e
puede intervenir en ese caso, al menos para mí. Sin embargo, todavía tengo que tropezar con un sed
que no los interpreta de manera bastante intercambiable.
;
antes de una nueva línea, una nueva línea está bien. Honestamente, podría prescindir del -e
y todo por completo y simplemente escribir un archivo como #!/bin/sed
con cada comando en una nueva línea, o aquellos que no requieren tales delimitadores en su lugar delimitados ;
. Los que lo requieren nuevas líneas son generalmente los que tienen de entrada arbitrarias - :
nombres de las etiquetas y los comandos que se refieren a ellos como b
o t
o cerrar }
curlies para las funciones, o r
EAD y w
rito que toman argumentos de nombre de archivo. Todos ellos deben ser seguidos de forma portátil \n
.
b;n;:b
, se está bifurcando a la etiqueta llamada";n;:b"
en seds históricos y POSIX (y GNU sed no está en ese sentido).