2011-12-15 13 views
7

Me gustaría eliminar todo el carácter de nueva línea que aparece después de una cadena particular y reemplazarla con un espacio de tabulación. Digamos por ejemplo, mi sample.txt es el siguienteEliminar una nueva línea después de un texto en particular a través de bash/awk/sed/perl

foo 
bar bar bar bar some text 

me gustaría que fuera

foo bar bar bar bar some text 

¿Cómo se hace esto a través de bash/awk/sed. Ayuda.

+0

¿Qué pasó con "algún texto"? –

+0

Sólo lo extraño, no hace la diferencia, supongo. por lo que la salida deseada debe ser foo bar bar bar bar texto – Greenhorn

Respuesta

11

en aWK:

awk '/foo$/ { printf("%s\t", $0); next } 1' 
+0

Woot! Trabajó en un santiamén. Gracias :) – Greenhorn

+0

Sí, ese es un enfoque típico de awk. Escribí una solución sed debajo en algún lugar entre las respuestas ... :) – DejanLekic

+4

Para aquellos que se preguntan sobre el 1 al final; en pocas palabras, se traduce en '{print $ 0}' de modo que las líneas que * no * coincidan con foo se impriman como están, es decir, el formato básico es 'awk '{/ some_pat/{/ * si pat es verdadero * /} {/ * si pat es falso * /} '' –

2

No todas las herramientas pueden hacer reemplazo de línea nueva. Perl puede:

cat file.txt | perl -p -e 's/\n/ /g' 
+3

mmm 1. se ha perdido el requisito 'foo'. 2. te perdiste el requisito _tab_ – sehe

2

Mmm. No estoy seguro que se adapte a sus necesidades, pero me gustaría hacer esto en vim:

:g/^foo$/join 

O, si foo podría estar en cualquier lugar en una línea:

:g/foo$/join 

Por supuesto, :%s/foo\n/foo\t/g va a hacer muy bien también

+0

¡Intenté esto también! Funcionó :) – Greenhorn

1

Esto podría funcionar para usted:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/{N;s/\n/\t/}' 
foo  bar bar bar bar some text 

realidad:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/N;s/\n/\t/' 
foo  bar bar bar bar some text 

El ¡la última solución es menos eficiente pero no por mucho!

1
perl -pe 's/foo\n/foo\t/g' temp2.txt 

a continuación es la prueba.

243> cat temp2.txt 
foo 
bar bar bar bar some text 
pearl[[email protected]].244> perl -pe 's/foo\n/foo\t/g' temp2.txt 
foo  bar bar bar bar some text 
0

La versión sed parece

#!/bin/sed -f 
/foo/{ 
N 
s/\n/\t/ 
} 

Si esto es todo lo que quiere hacer en su comando sed, puede simplificar lo anterior a una sola línea:

sed -e '/foo/N;y/\n/\t/' <sample.txt 

Explicación: N agrega una nueva línea y la siguiente línea de entrada; y/\n/\t reemplaza todas las nuevas líneas con pestañas, o s/\n/\t/ reemplaza la primera nueva línea con una pestaña.

Tenga en cuenta que dado que sed está orientado a la línea, las líneas nuevas en la entrada se consideran separadores de línea en lugar de formar parte de cualquier línea (esto contrasta, por ejemplo, con Perl).

Cuestiones relacionadas