borzole Napisano Maj 31, 2010 Zgłoszenie Share Napisano Maj 31, 2010 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 More sharing options...
esail Napisano Maj 31, 2010 Zgłoszenie Share Napisano Maj 31, 2010 Musisz to mieć w sed? Bo jak nie mogę podrzucić mini skrypt w pythonie. Es. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
ra-v Napisano Maj 31, 2010 Zgłoszenie Share Napisano Maj 31, 2010 grep -vE "^#.+$" skrypt.sh Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
esail Napisano Maj 31, 2010 Zgłoszenie Share Napisano Maj 31, 2010 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 More sharing options...
hello_world Napisano Maj 31, 2010 Zgłoszenie Share Napisano Maj 31, 2010 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 More sharing options...
jjj Napisano Maj 31, 2010 Zgłoszenie Share Napisano Maj 31, 2010 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 More sharing options...
borzole Napisano Maj 31, 2010 Autor Zgłoszenie Share Napisano Maj 31, 2010 @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. 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 More sharing options...
jjj Napisano Maj 31, 2010 Zgłoszenie Share Napisano Maj 31, 2010 @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 More sharing options...
jjj Napisano Czerwiec 1, 2010 Zgłoszenie Share Napisano Czerwiec 1, 2010 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 More sharing options...
borzole Napisano Czerwiec 1, 2010 Autor Zgłoszenie Share Napisano Czerwiec 1, 2010 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 More sharing options...
Rekomendowane odpowiedzi
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ę