$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere
El sed
comando anterior reemplaza el nuevo carácter de línea con la cadena "cadena". Pero no sé el significado de :a;$!N;s/\n/string/;ta
dentro de las comillas simples. Conozco la parte del medio s/\n/string/
. Pero no sé la función de la primera ( :a;$!N;
) y última ( ta
) parte.
sed
text-processing
Avinash Raj
fuente
fuente
Respuestas:
Estos son los
sed
comandos , ciertamente crípticos . Específicamente (deman sed
):Por lo tanto, el script que publicó puede desglosarse en (espacios agregados para facilitar la lectura):
Básicamente, lo que está haciendo podría escribirse en pseudocódigo como
Puede entender esto un poco mejor con un ejemplo de entrada más complejo:
No estoy realmente seguro de por qué
!$
se necesita. Por lo que puedo decir, puedes obtener la misma salida confuente
$!
no!$
. Sin embargo, también podría ser!N
y no$!
.!N
o$!
. Entonces, sigo pensando que está buscando si la última línea es nueva línea o EOF.$!
como una dirección 'rango' con un operador de sufijo complemento - así$!N
(hacerN
todas partes excepto por la dirección$
) es realmente la misma sintaxis que algo así comom,n!d
(borrar todo excepto las líneasm
an
).:
es análogo a lagoto
etiqueta, y de hecho:
solía ir a la etiqueta en el caparazón de Thompson, por lo que sería familiar para las personas que usaban tanto el caparazón de sed como el de ThompsonHe puesto esta respuesta ya que veo una gran confusión acerca de por qué la última línea se excluye al ejecutar
N
(a través de la cadena frente a la línea$!
), y porque el PO estaba confundido sobre el significado de:a;$!N;
en un comando sed , no sólo en el concreto uno que publicó .Bueno, el beneficio de usar en
$!N
lugar deN
no es evidente en los ejemplos propuestos (por el OP y por @terdon), ya que no se ejecuta un comando "importante" (seguir leyendo) en la última línea después delN
comando. (De hecho, el resultado es el mismo si se quita esa dirección de línea).En un ejemplo más complejo (por ejemplo, sustituir
this sentence
en un archivo, con las dos palabras que aparecen a veces en una línea y otras veces en dos líneas), ¡excluir la última línea para elN
comando podría ser crucial! Si no se excluye la última línea, al ejecutarlaN
,sed
golpeaEOF
y sale inmediatamente, evitando que se ejecuten todos los comandos posteriores (también comandos de ramificación, a saber,t
yb
).En los ejemplos demasiado simplistas que se muestran, podemos eliminar de forma segura
$!
y dejar quesed
falle en la ejecuciónN
y regresar ya que els
comando abortado no haría nada si se ejecutara, ya que no hay\n
coincidencias.fuente