2009-11-12 7 views
22

Muszę wymyślić wyrażenie regularne, aby usunąć wszystkie wiersze, które nie zaczynają się od "+" lub "-".Jak mogę usunąć wszystkie wiersze, które nie zaczynają się od określonych znaków?

Chcę wydrukować papierową kopię dużego pliku diff, ale pokazuje on 5 lub więcej linii przed i po rzeczywistej zmianie.

+1

Dlaczego nie można po prostu zregenerować diff i poinformować go, aby zmniejszyć # wierszy kontekście? –

+1

Za to, co właśnie zasugerowałem, polecenie brzmi 'diff -c 0-u 0' –

Odpowiedz

46

W VIM:

:g!/^[+-]/d

Oto tłumaczenie na język angielski:

g lobally coś zrobić dla wszystkich linii, które NIE ! mecz wyrażenia regularnego: start linii ^ następnie obu + lub -, i że coś zrobić, to d suĹ te linie.

+0

Świetnie, dzięki! To jest dobra poprawka. – mager

+4

jeśli chcesz zapisać jedno naciśnięcie klawisza: ": v" jest synonimem ": g!" :) –

+0

To zapisuje dwa naciśnięcia klawiszy! Shift, 1. Schludny. – Marcin

0

diff -u <some args here> | grep '^[+-]'

Albo po prostu nie mógł produkować dodatkowe linie w ogóle:

diff --unified=0 <some args>

0
cat your_diff_file | sed '/^[+-]/!D' 
+0

bezużyteczne użycie' cat': 'sed' akceptuje nazwy plików jako argumenty –

+0

Zgadzam się w tym konkretnym przypadku. Zwykle używam kota, gdy używam długiego łańcucha poleceń sed do stopniowego odfiltrowywania danych. Jeśli mam na początku zbyt duży plik danych, zastępuję kota głowicą -100, a pozostała część pozostaje taka sama. –

0
egrep "^[+-]" difffile >outputfile 

Zamiast usuwać wszystko, co nie pasuje, wyświetlane są tylko zgodne linie. :)

+1

Zdecydowanie potrzebujesz innej karetki i nie potrzebujesz "e" ani cytatów. To działa dla mnie: 'grep^[^ + -]' –

0

Jeśli trzeba zrobić coś bardziej skomplikowane pod względem wyrażeń regularnych, należy korzystać z tej strony: http://txt2re.com/

zapewnia również przykłady kodu dla wielu różnych językach.

+0

Dzięki! To jest niesamowite!! – mager