2011-12-15 25 views
7

Chciałbym usunąć cały znak nowego wiersza, który występuje po ciągi partiular i zastąpić go tabulatorem. Powiedzieć na przykład moja sample.txt jest następującyUsuwanie nowej linii po określonym tekście za pośrednictwem bash/awk/sed/perl

foo 
bar bar bar bar some text 

chciałbym go mieć

foo bar bar bar bar some text 

Jak mogę to zrobić za pośrednictwem bash/awk/sed. Rób pomoc.

+0

Co stało się z "tekstem"? –

+0

Tęskniłem za tym, nie ma znaczenia, jak sądzę. , więc pożądane wyjście powinno być pasek paska prętów foo tekst niektóre – Greenhorn

Odpowiedz

11

W awk:

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

Woot! Pracował w migiem. Dzięki :) – Greenhorn

+0

Tak, to typowe podejście awk. Napisałem rozwiązanie sed poniżej gdzieś wśród odpowiedzi ... :) – DejanLekic

+4

Dla tych, którzy zastanawiają się nad 1 na końcu; po prostu, tłumaczy się na '{print $ 0}', więc linie, które * nie * pasują do foo, są drukowane tak jak są, tj. podstawowy format to 'awk '{/ some_pat/{/ * jeśli pat jest prawdą * /} {/ * jeśli pat jest fałszywy * /} " –

2

Nie wszystkie narzędzia mogą zastępować nową linię. Perl może:

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

mmm 1. przegapiłeś wymagania "foo". 2. Tęskniłeś za wymogiem _tab_ – sehe

2

Mmm. nie wiem, to pasuje do Twoich wymagań, ale zrobiłbym to w vim:

:g/^foo$/join 

Lub, jeśli foo może być wszędzie na linii:

:g/foo$/join 

Oczywiście :%s/foo\n/foo\t/g zrobi ładnie zbyt

+0

Wypróbowałeś to również! Pracował :) – Greenhorn

1

To może pracować dla Ciebie:

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

Właściwie:

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

drugie rozwiązanie jest mniej wydajne, ale nie za dużo!

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

poniżej jest testem.

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

Wersja sed wygląda

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

Jeśli jest to wszystko, co chcesz robić w sed polecenia, można uprościć powyższe do jednego-liner:

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

Objaśnienie: N dołącza znak nowej linii i następną linię wprowadzania; y/\n/\t zamienia wszystkie nowe znaki na tabulatory lub s/\n/\t/ zamienia pierwszy znak nowej linii na tabulator.

Warto zauważyć, że linia sed jest zorientowane na innej linii na wejściu są uważane LINE-separatorów, a nie w ramach każdej linii (to jest, w przeciwieństwie na przykład do Perl).

Powiązane problemy