2013-05-05 7 views
5

Zastanawiam się, jak mogę wydrukować tylko pierwsze słowo każdego akapitu z sed jednym liniowcem. W tym przypadku akapit jest definiowany przez tekst następujący po 2 liniowych podziałach.Drukuje tylko pierwsze słowo każdego akapitu za pomocą sed

np.

This is a paragraph with some text. Some random text that is not really important. 

This is another paragraph with some text. 
However this sentence is still in the same paragraph. 

ta powinna zostać przekształcona do

This 

This 

Odpowiedz

2

Możliwym rozwiązaniem byłoby GNU sed:

sed -rn ':a;/^ *$/{n;ba};s/(|$).*//p;:b;n;/^ *$/ba;bb' 

wyjściowa:

This 
This 

Traktuje linie typu "spacje" jako puste i rozumie dowolną liczbę pustych linii między akapitami. Przetwarza również poprawnie akapity w jednym słowie.

7

Pomyśl paragraph mode

 
By a special dispensation, an empty string as the value of RS indicates that 
records are separated by one or more blank lines. 

awk lub perl mieć poparcie dla 'trybie ust' i albo by dokonać lepszego wyboru niż sed:

awk '{ print $1 }' RS= ORS="\n\n" file 

lub

perl -00 -lane 'print $F[0]' file 

Wyniki:

This 

This 
+0

Wystarczy marginesie, jeśli chciał separator rekordu należy _exactly_ dwa końce linii, użyj 'RS = "\ n \ n"' dla 'awk'. Nie pamiętam, jak to zrobić w 'perl' na linii cmd. Może ktoś inny tutaj by wiedział? – Steve

+0

takie proste, tak jasne ... +1 oczywiście. –

0

To może pracować dla Ciebie (GNU sed):

sed ':a;$!{N;/\n\s*$/!ba};s/\s.*/\n/' file