Mam to:
sed -i '/^$/d' temp_spec.rb
który usuwa puste linie i działa dobrze. Jak mogę to zrobić tylko dla linii 5-999 (najlepiej 5 do końca pliku).
Próbowałem:
sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb
ale żadne nie działało (bez błędów).
Odpowiedzi:
Jeśli chcesz usunąć wszystkie puste linie zaczynające się od linii 5 i zachować linie od 1 do 4, możesz użyć
{
Jest operatorem grupowania, więc pierwsze polecenie5,${
czyli „od linii 5 do końca wejściowego ($
) wykonanie następujących poleceń do dopasowywania}
”. Polecenia między{
i}
mogą być ponownie poprzedzone adresami, więc polecenie wewnętrzne/^$/d
oznacza „jeśli nic nie ma między początkiem (^
) a końcem ($
) wiersza, usuń je”. Polecenia sed można rozdzielić;
. (Jest to źle udokumentowana funkcja sed. Jest obsługiwana przez większość implementacji sed, ale nie jest w pełni przenośna .) Jak zauważył Hauke,;
po{
jest opcjonalne; poprzedni}
jest jednak wymagany.Jeśli chcesz usunąć wszystkie puste linie zaczynające się od linii 5, a także usunąć linie od 1 do 4, łatwiej:
źródło
;
.;
.Inna opcja za pomocą awk:
źródło
Edycja 1:
Mam to wyjaśnić, a zatem ...
Jest to niepotrzebnie skomplikowane. Nie wiedziałem, że zakresy adresów są dozwolone w obrębie
{}
. Musiałem więc inaczej wyrazić „usuń puste linie”. Podstawowym poleceniemt
jest sedif ... then
.T
byłoby łatwiejsze, ale jest dostępne tylko dla GNU sed. Cytuję stronę podręcznika:Nadużywam słynnego
s
polecenia. Nie zastępuje niczego, tylko sprawdza, czy linia jest pusta. Zastępuje więc pustą linię pustą linią (może wykorzystać wszystko jako zamiennik, ponieważ i tak linia jest usuwana).Jeśli
s
dokonano „zamiany”, to linia jest pusta. W takim przypadku polecenied
zostanie wykonane. W przeciwnym razie nic nie można zrobić. Ponieważt
nie przeskakuje w przypadkus
akcji, potrzebuję polecenia gałęzi,b
aby przejść do końca skryptu.: label
są celami branżowymi. Jakgoto
wtedy w ciemnych czasach (kiedy wynaleziono sed ... te-hee).Inną opcją byłoby
s
„zastąpienie” wszystkich niepustych linii, dzięki czemus
bardziej skomplikowana, ale reszta polecenia jest łatwiejsza:^..*$
oznacza „niepustą linię” i\1
„treść pierwszych nawiasów”.źródło