separador print examples comando campos cadena buscar linux sed awk

print - Eliminar nuevas líneas de Windows en Linux(sed vs. awk)



awk separador de campos (4)

Creo que algunas versiones de sed no lo reconocerán como un personaje. Sin embargo, puede usar una función bash para evitar esa limitación:

echo $string | sed $''s//r//''

Aquí, permite que bash reemplace ''/ r'' con el verdadero carácter de retorno de carro dentro de la construcción $''...'' antes de pasar eso a sed como su comando. (Suponiendo que usa bash , otras conchas deberían tener una construcción similar).

Tenga algunos archivos delimitados con caracteres de nueva línea colocados incorrectamente en el centro de los campos (no en los extremos de la línea), que aparecen como ^ M en Vim. Se originan a partir de las exportaciones de freebcp (en Centos 6) de una base de datos MSSQL. Volcar los datos en hexadecimal muestra / r / n patrones:

$ xxd test.txt | grep 0d0a 0000190: 3932 3139 322d 3239 3836 0d0a 0d0a 7c43

Puedo eliminarlos con awk, pero no puedo hacer lo mismo con sed.

Esto funciona en awk, eliminando los saltos de línea por completo:

awk ''gsub(//r/,""){printf $0;next}{print}''

Pero esto en sed no, dejando líneas de alimentación en su lugar:

sed -i ''s//r//g''

donde esto parece no tener efecto:

sed -i ''s//r/n//g''

El uso de ^ M en la expresión sed (ctrl + v, ctrl + m) tampoco parece funcionar.

Para este tipo de tarea, sed es más fácil asimilar, pero estoy trabajando para aprender más sobre ambos. ¿Estoy usando sed incorrectamente, o hay una limitación?


Otro método

awk 1 RS=''/r/n'' ORS=

  • establecer Record Separator en /r/n
  • establecer Separador de registros de salida para vaciar la cadena
  • 1 es siempre verdadero, y en ausencia de un bloque de acción se usa {print}

Puede usar la herramienta de línea de comando dos2unix

dos2unix input

O use el comando tr :

tr -d ''/r'' <input >output

En realidad, puedes hacer el cambio de formato de archivo en vim :

Método A:

:e ++ff=dos :w ++ff=unix :e! Método B:

:e ++ff=dos :set ff=unix :w

EDITAR

Si desea eliminar las secuencias /r/n en el archivo, intente estos comandos en vim :

:e ++ff=unix " <-- make sure open with UNIX format :%s//r/n//g " <-- remove all /r/n :w " <-- save file

Tu solución awk funciona bien. Otras dos soluciones sed :

sed ''1h;1!H;$!d;${g;s//r/n//g}'' input sed '':A;//r$/{N;bA};s//r/n//g'' input


sed -e ''s//r//g'' input_file

Esto funciona para mí La diferencia de -e en lugar de -i comando.

También mencioné que ver en diferentes plataformas se comportan de manera diferente. El mío es: sed --version This is not GNU sed version 4.0