2012-05-16 6 views
28

Soy nuevo en el scripting de shell y estoy tratando de eliminar el nuevo carácter de línea de cada línea usando SED. esto es lo que he hecho hasta ahora:eliminando el carácter de la nueva línea de la secuencia entrante usando sed

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' 

elimina único personaje Ist nueva línea. he encontrado en alguna parte de este comando:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g' 

pero da: "ba: Evento no encontrado".

si lo hago:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g' 

entonces se da salida correcta pero estoy en busca de algo mejor, ya que no estoy seguro cuántos nuevo personaje que voy a tener cuando corro el guión. transmisión entrante es de echo o printf o alguna variable en script. Gracias de antemano

+0

El 'ba: Evento no encontrado' de error es de su cáscara. Deja de usar csh o escapa del! –

+0

@WilliamPursell tengo que usar csh solo no tengo otras opciones para mí. ¡Por su sugerencia me caí! "printf" {new \ nto \ nlinux} "| sed ': a; N; $ ba; s/\ n// g'" este comando tampoco está dando el resultado correcto. Sé que hay muchas desventajas de usar csh pero tiene que usarlo debido a alguna compulsión :(..gracias –

+0

No se puede eliminar el '!', pero se debe preceder con una barra invertida. –

Respuesta

64

Para eliminar los saltos de línea, el uso tr:

tr -d '\n' 

Si desea reemplazar cada salto de línea con un solo espacio:

tr '\n' ' ' 

El error ba: Event not found proviene de CSH, y se debe a que csh intenta hacer coincidir !ba en su lista de historial. Se puede escapar de la ! y escribir el comando:

sed ':a;N;$\!ba;s/\n/ /g' # Suitable for csh only!! 

pero Sed es la herramienta equivocada para esto, y que sería mejor usar una concha que se encarga de cadenas entre comillas más razonable. Es decir, deja de usar csh y comienza a usar bash.

+0

gracias por su respuesta, pero ¿podemos usar tr para modificar la corriente entrante de echo o printf? –

+1

tr es un filtro. 'printf ... | tr ...' funcionará bien –

+0

No, esto aún no funciona. Incluso con '$ \! ba', el resultado es' ba: Evento no encontrado' desde un script csh. – krb686

6

Esto podría funcionar para usted:

printf "{new\nto\nlinux}" | paste -sd' '    
{new to linux} 

o:

printf "{new\nto\nlinux}" | tr '\n' ' '    
{new to linux} 

o:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g' 
{new to linux} 
+2

+1: Buen uso de pasta. Tenga en cuenta que la solución sed aquí no funcionará con csh debido a las reglas (erróneas) de citas, y el '!'todavía debe ser escapado. –

+0

Yay, pegar. Sin embargo, necesita un guion al final para indicar que debe leer de stdin: 'paste -sd" "-' – Jelle

+0

tr -d" \ n "solo me deja con la última línea de stdin ..:/(en Mac) –

Cuestiones relacionadas