Skocz do zawartości

[sed] Wypisz Pierwszy Zwarty Blok Komentarzy Bash


borzole

Rekomendowane odpowiedzi

Mam skrypt o np. takiej budowie na początku

#!/bin/bash      
# jakiś opis      
# długi komentarz      
# druga linia komentarza   
FILE=abc      
# ------------------------------------------------------------------------------      
# komentarz

i teraz chciałbym wypisać pierwszy zwarty blok komentarzy, czyli część

# jakiś opis  
# długi komentarz  
# druga linia komentarzu

obcięcie powinno następować, gdy linia nie zaczyna się od # niestety to co mam działa raczej jak grep i nie kumam dlaczego.

sed -n '/^#[[:space:]][[:alnum:]]/,/^[^#]/p' skrypt.sh

Pisali, że sed -n '/od/,/do/p' plik wypisze blok, że [^#] wyklucza #, no ale nic nie chce działać.

O co biega,

Odnośnik do komentarza
Udostępnij na innych stronach

Musisz to mieć w sed? Bo jak nie mogę podrzucić mini skrypt w pythonie.

 

Es.

Odnośnik do komentarza
Udostępnij na innych stronach

grep -vE "^#.+$" skrypt.sh

No tak nie do końca.

dariusz ~  $  grep -vE "^#.+$" skrypt.sh
FILE=abc
dariusz ~  $

 

Odnośnik do komentarza
Udostępnij na innych stronach

Pisali, że sed -n '/od/,/do/p' plik wypisze blok, że [^#] wyklucza #, no ale nic nie chce działać.

No i teraz doczytałem i tu chodzi że pierwszy parametr to zaczyna się a drugi kończy ale na końcu wiersza stąd zbiera wszystko po drodze

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Nie jestem ekspertem sed, ale lubię to narzędzie. Zastanawiając się, jak wykryć pierwszy blok za pomocą znacznika trzymanego w buforze, doszedłem do czegoś takiego. Jest skuteczne, le rozlazłe; one-liner byłby ładniejszy.

# jeśli nie komentarz, to zmień status bufora i usuń wiersz
/^[^#]/{
   x
   /1$/s/.*/&2/
   x
   d
}
# jeśli komentarz, to zmień status, i usuń wiersz jeśli nie jest to pierwszy blok komentarza
/^#/{
   x
   /^$/s/.*/1/
   /2$/s/.*/&1/
   /12/ {
   x
   d
   x
   }
   x
}

Korzystając z -n możesz skrócić skrypt o kilka poleceń.

A Twój pierwotny skrypt? zajrzę w wolnym czasie.

Odnośnik do komentarza
Udostępnij na innych stronach

@jjj prawie git, tylko niestety jeszcze skleja bloki komentarzy, gdy są rozdzielone pustą linią.

 

A prototyp tego co chcę osiągnąć jest tu: spis.sh

 

"Odkryłem" ostatnio, że jak się zmieni IFS to zenity łapie dynamiczną listę ze spacjami i musiałem to czym prędzej wcielić w życie. Więc ten skrypt listuje wszelkie skrypty z /usr/local/{,s}bin/* wraz z opisami.

spis-skryptow.png

Początkowo miał łapać 1 linię, ale potem stwierdziłem, że poco się ograniczać do 1 linii. Po drugie chciałem, żeby blok opisujący był jak najbardziej naturalnie zapisany.

Obecnie mam jeszcze dziwny problem, gdy chcę usunąć "#!". Dostaję z zenity błąd o nieznanej opcji. Zupełnie nie mogą znaleźć przyczyny.

Reszta to tylko retusz i "uładnianie".

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

@jjj prawie git, tylko niestety jeszcze skleja bloki komentarzy, gdy są rozdzielone pustą linią.
Bo dopasowuje albo do # na początku wiersza, albo do nie-# na początku wiersza.

Trzeba dodać regułę dla wiersza pustego, lub rozbudować regułę opisu nie-komentarza.

 

Odnośnik do komentarza
Udostępnij na innych stronach

W sprawie

sed -n '/^#[[:space:]][[:alnum:]]/,/^[^#]/p' skrypt.sh

Pisali, że sed -n '/od/,/do/p' plik wypisze blok, że [^#] wyklucza #, no ale nic nie chce działać.

O co biega,

Twoje polecenie p z podwójnym adresem wyprowadza każdy blok począwszy od wiersza #<spacja><litera> aż do wiersza nie-#, z tym ostatnim włącznie. Takie właśnie zachowanie obserwuję.

Obawiam się, że bez użycia wewnętrznego bufora nie rozstrzygniesz, który z kolei jest to blok. Ale -- jak rzekłem wcześniej -- w sed-zie nie jestem ekspertem.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Patrzyłem na to co napisał jjj udając żerującego karpia z jednym okiem zaciśniętym, drugim zbielałym i poszukałem rozwiązania w AWK.

awk 'BEGIN { FS="\n"; RS=""; i=0 } { if (i == 1) print $0; i++ }'  plik.sh

szuka rekordów rozdzielonych pustą linią, więc pierwszy to #!, a drugi (i==1) może być opisem. Np.

#!/bin/bash

# skrypt robi czary mary
# i w ogóle jest cool & trendy

# wersja: 2010.02.10

Może nie jest aż tak idiotoodporne jak rozwiązanie sed'em, ale przynajmniej wiem o co chodzi :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...