$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere
El sedcomando anterior reemplaza el nuevo carácter de línea con la cadena "cadena". Pero no sé el significado de :a;$!N;s/\n/string/;tadentro 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
sedcomandos , 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!Ny no$!.!No$!. 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(hacerNtodas partes excepto por la dirección$) es realmente la misma sintaxis que algo así comom,n!d(borrar todo excepto las líneasman).:es análogo a lagotoetiqueta, 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
$!Nlugar deNno 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 delNcomando. (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 sentenceen 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 elNcomando podría ser crucial! Si no se excluye la última línea, al ejecutarlaN,sedgolpeaEOFy sale inmediatamente, evitando que se ejecuten todos los comandos posteriores (también comandos de ramificación, a saber,tyb).En los ejemplos demasiado simplistas que se muestran, podemos eliminar de forma segura
$!y dejar quesedfalle en la ejecuciónNy regresar ya que elscomando abortado no haría nada si se ejecutara, ya que no hay\ncoincidencias.fuente