bash shell newline text-processing

bash - shell replace cr / lf por comas



newline text-processing (8)

Con sed , podrías usar:

sed -e ''H;${x;s//n/,/g;s/^,//;p;};d''

El H agrega el espacio del patrón al espacio de espera (guardando la línea actual en el espacio de espera). El ${...} rodea las acciones que se aplican solo a la última línea. Esas acciones son: x swap hold y pattern space; s//n/,/g sustituye las nuevas líneas incrustadas con comas; s/^,// eliminar la coma inicial (hay una nueva línea al comienzo del espacio de retención); y p imprimir. La d borra el espacio del patrón - sin impresión.

También puedes usar, por lo tanto:

sed -n -e ''H;${x;s//n/,/g;s/^,//;p;}''

El -n suprime la impresión predeterminada, por lo que la d final ya no es necesaria.

Esta solución asume que las terminaciones de línea CRLF son la terminación de línea local nativa (por lo que está trabajando en DOS) y que sed generará, por lo tanto, la línea nativa local que termina en la operación de impresión. Si tiene una entrada en formato DOS pero quiere un formato Unix (solo LF), entonces tiene que trabajar un poco más, pero también debe estipular esto explícitamente en la pregunta.

Funcionó bien para mí en MacOS X 10.6.5 con los números 1..5 y 1..50 y 1..5000 (23.893 caracteres en la línea única de salida); No estoy seguro de que quiera presionarlo más.

Tengo input.txt

1 2 3 4 5

Necesito obtener ese output.txt

1,2,3,4,5

¿Cómo hacerlo?


En respuesta al comentario de @Jonathan a la respuesta de @eumiro:

tr -s ''/r/n'' '','' < input.txt | sed -e ''s/,$//n/'' > output.txt


Prueba esto:

tr ''/n'' '','' < input.txt > output.txt


Utilice el comando pegar. Aquí está usando tuberías:

echo "1/n2/n3/n4/n5" | paste -s -d, /dev/stdin

Aquí está usando un archivo:

echo "1/n2/n3/n4/n5" > /tmp/input.txt paste -s -d, /tmp/input.txt

Por páginas man, s concatena todas las líneas yd permite definir el carácter delimitador.


tr y sed utilizados son muy buenos, pero cuando se trata de análisis de archivos y expresiones regulares, no se puede vencer a Perl (No estoy seguro de por qué la gente piensa que sed y tr están más cerca del caparazón que el perl ...)

perl -pe ''s//n/$1,/'' your_file

si quieres que lo haga el caparazón puro, mira la coincidencia de cadenas

${string/#substring/replacement}


cat input.txt | sed -e ''s|$|,|'' | xargs -i echo "{}"


  • Versiones awk:
    • awk ''{printf("%s,",$0)}'' input.txt
    • awk ''BEGIN{ORS=","} {print $0}'' input.txt
    • Salida - 1,2,3,4,5,

Como solicitó 1,2,3,4,5 , en comparación con 1,2,3,4,5, (observe la coma después de 5, la mayoría de las soluciones anteriores también incluyen la coma final), aquí hay dos más versiones con Awk (con wc y sed ) para deshacerse de la última coma:

  • i=''input.txt''; awk -vc=$(wc -l $i | cut -d'' '' -f1) ''{printf("%s",$0);if(NR<c){printf(",")}}'' $i

  • awk ''{printf("%s,",$0)}'' input.txt | sed ''s/,/s*$//''


  • versión de python:

    python -c ''import sys; print(",".join(sys.stdin.read().splitlines()))''

No tiene el problema de la coma al final (porque la join funciona de esa manera), y las splitlines dividen los datos en terminaciones de línea nativas (y los elimina).