sed fjerner kun \ n leveret af kommandoen sed '='

В регулярных выражениях, $ соответствует концу строки. Таким образом, вы можете использовать его для сопоставления последних 6 (в вашем вопросе упоминается 5, но вы показываете 6, если нет конечного пробела, который вы нам не показываете) символов и добавлять пробел перед ними. Например:

  • Sed:

     sed 's /......$/ & /' файл 
     

    или

     sed 's /. \ {6 \} $ / & / 'файл 
     
  • GNU или FreeBSD sed:

     sed -E' s /. {6} $ / & / 'файл 
     
  • Perl

     perl -pe 's /. {6} $ / $ & /' file 
     
  • awk

     awk '{sub (/. {6} $ /, "&"); print}' файл 
     
7
16.06.2018, 00:14
5 ответов

Su segundo guión sed,

N
s/\n/ /

no funciona de la manera esperada porque leerá una línea, luego agregará la siguiente línea con una nueva línea incrustada insertada por el comando N, y luego reemplazará esa nueva línea con un espacio (y generará ). Al leer la línea siguiente, este resultado de las dos primeras líneas se descarta.

En su lugar, habría tenido que usar el espacio de espera:

H;            # append to hold space with a '\n' embedded
              # for the last line:
${
    x;        # swap in the hold space
    s/\n//;   # delete the first newline (from the H command on the very first line of input)
    y/\n/ /;  # replace all other newlines with spaces
    p;        # print result
}

Este script se ejecuta una vez por cada línea de entrada, recopilando datos en el espacio de espera hasta que lleguemos a la última línea. En la última línea, procesamos los datos recopilados y los generamos.

Ejecutarías esto consed -n:

$ sed '=' <file2 | sed -n 'H; ${ x; s/\n//; y/\n/ /; p; }'
1 this is  2  not is  3  is is  4  this biz

(sin nueva línea al final de la salida, ya que no había ninguna al final de la entrada ).

Alternativamente, con un bucle explícito podemos usar N. El truco aquí es nunca llegar al final del script hasta que estemos listos para imprimir el resultado.

:top;     # define label 'top'
N;        # append next line with a '\n' embedded
$!btop;   # if not at end, branch to 'top'
y/\n/ /;  # replace all newlines with spaces
          # (implicit print)

Este script solo ejecuta (hasta el final )una vez y administra la lectura de los datos en sí, mientras que el script anterior fue alimentado con datos por el bucle de lectura integrado -ensed(que reemplaza el espacio del patrón para cada línea leída, que fue su problema ). Utiliza el espacio de patrones en lugar del espacio de retención para recopilar los datos y los procesa cuando se lee la última línea.

En la línea de comando:

$ sed '=' <file2 | sed ':top; N; $!btop; y/\n/ /'

(misma salida que arriba)

7
27.01.2020, 20:15

Esto se debe fundamentalmente a que sedestá orientado a líneas. Lo que pasa es

  • sed carga la primera línea 1en el espacio del patrón
  • el comando Ncarga la siguiente línea y la agrega al espacio del patrón, separada por \n, dando1\nthis is
  • reemplazamos \npor espacio dando1 this is

y listo; se imprime el espacio del patrón y luego se repiten los pasos para cada uno de los (pares restantes de )líneas.

3
27.01.2020, 20:15

Si es GNU sed, prueba esto

$ sed -z 's/\n/ /g' file2
this is   not is   is is   this biz
$

trhace un trabajo igualmente bueno.

$ tr '\n' ' ' <file2
this is   not is   is is   this biz
$
4
27.01.2020, 20:15

El comando que usó solo procesa líneas en pares .
La primera línea es el número de línea (impreso por el comando =).
La segunda línea se agrega a la primera, se elimina una nueva línea y se imprime.
Luego, el siguiente par de líneas se procesa igualmente.

La única forma de procesar todas las líneas es acumularlas hasta la última línea.
En ese momento, todas las líneas nuevas podrían borrarse/traducirse a espacios:

$ sed '=' file | sed ':start;N;$bend;bstart;:end;y/\n/ /'
1 this is  2  not is  3  is is  4  this biz

Una línea más corta (pero también más lenta, lo cual no es un problema con este archivo tan corto )es:

sed ':1;N;s/\n/ /;t1'

Tenga en cuenta que las dos soluciones anteriores almacenarán todo el archivo en la memoria.

Pero, por supuesto, tres una mejor herramienta para este trabajo:

$ sed '=' file | tr '\n' ' '

O, también,paste(que retiene la nueva línea final):

$ sed '=' file | paste -sd ' '
1 this is  2  not is  3  is is  4  this biz
0
27.01.2020, 20:15

Пробовал с помощью приведенной ниже команды, все работает нормально

inputfile

this is
 not is
 is is

команда:

cat inputfile|sed "="| sed "N;s/\n/ /g"| sed "N;s/\n/ /g"| sed "N;s/\n/ /g"

выход

1 this is  2  not is  3  is is  4  this biz
0
27.01.2020, 20:15

Теги

Похожие вопросы