В регулярных выражениях, $
соответствует концу строки. Таким образом, вы можете использовать его для сопоставления последних 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}' файл
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)
Esto se debe fundamentalmente a que sed
está orientado a líneas. Lo que pasa es
1
en el espacio del patrón N
carga la siguiente línea y la agrega al espacio del patrón, separada por \n
, dando1\nthis is
\n
por 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.
Si es GNU sed
, prueba esto
$ sed -z 's/\n/ /g' file2
this is not is is is this biz
$
tr
hace un trabajo igualmente bueno.
$ tr '\n' ' ' <file2
this is not is is is this biz
$
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, tr
es 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
Пробовал с помощью приведенной ниже команды, все работает нормально
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