2011-12-15 13 views
7

Vorrei rimuovere tutto il carattere di nuova riga che si verifica dopo una stringa particolare e sostituirlo con uno spazio di tabulazione. Dire per esempio il mio sample.txt è la seguenteRimozione di una nuova riga dopo un particolare testo tramite bash/awk/sed/perl

foo 
bar bar bar bar some text 

vorrei che fosse

foo bar bar bar bar some text 

Come faccio a fare questo tramite bash/awk/sed. Fare aiuto

+0

Che cosa è successo a "un po 'di testo"? –

+0

Mi è mancato, non fa differenza, immagino. quindi l'uscita desiderata dovrebbe essere foo bar bar bar qualche testo – Greenhorn

risposta

11

In awk:

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

Woot! Ha funzionato in un batter d'occhio. Grazie :) – Greenhorn

+0

Sì, questo è un tipico approccio awk. Ho scritto una soluzione sed sotto qualche parte tra le risposte ... :) – DejanLekic

+4

Per chi si interroga sulla 1 alla fine; semplicemente, traduce in '{print $ 0}' in modo che le righe che * non * corrispondono a foo siano stampate così come sono, cioè il formato di base è 'awk '{/ some_pat/{/ * se pat è vero * /} {/ * se pat is false * /} '' –

2

Non tutti gli strumenti possono eseguire la sostituzione di nuova linea. Perl can:

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

mmm 1. ti sei perso il requisito 'pippo'. 2. hai perso il requisito _tab_ – sehe

2

Mmm. Non sicuro che questo si adatta alle vostre esigenze, ma mi piacerebbe fare questo in vim:

:g/^foo$/join 

Oppure, se foo potrebbe essere ovunque su una linea:

:g/foo$/join 

Naturalmente, :%s/foo\n/foo\t/g farà bene anche

+0

Provato anche questo! Ha funzionato :) – Greenhorn

4
perl -pe 's/(?<=foo)\n/\t/' input 
1

Questo potrebbe funzionare per voi:

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

realtà:

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

Il quest'ultima soluzione è meno efficiente ma non di molto!

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

di seguito è il test.

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 versione sed sembra

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

Se questo è tutto quello che vuoi fare nel comando sed, è possibile semplificare il precedente per una battuta:

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

Spiegazione: N aggiunge una nuova riga e la riga successiva di input; y/\n/\t sostituisce tutte le nuove righe con le schede o s/\n/\t/ sostituisce la prima nuova riga con una scheda.

Si noti che poiché sed è orientato alla linea, i newline nell'input sono considerati separatori di riga anziché come parte di qualsiasi riga (questo è in contrasto, ad esempio in Perl).

Problemi correlati