[Rozw.] [bash sed] Jak dodać nazwę pliku i nr linii do cat

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
VoyciecH
Użytkownik
Posty: 143
Rejestracja: 2007-03-14, 15:20
Lokalizacja: Nysa (Śląski Rzym)
Kontakt:

[Rozw.] [bash sed] Jak dodać nazwę pliku i nr linii do cat

Post autor: VoyciecH »

Witam forumowiczów,

chcę napisać skrypt BASH (a może da się to zrobić jednym poleceniem), który wyświetli zawartość plików będących parametrami skryptu dodając na początku nazwę pliku i numer wiersza. Chodzi o to, żeby szybko znaleźć plik i wiersz z tekstem, który mnie interesuje. Nie skrypt nazywa się na przykład: "cat2.sh"

Przykładowe pliki:

/tmp/plik1.txt

Kod: Zaznacz cały

Linia A
Linia B
/tmp/plik2.txt

Kod: Zaznacz cały

Linia M
Linia N
/tmp/plik3.txt

Kod: Zaznacz cały

Linia X
Linia Y
Linia Z
Wynik polecenia:

Kod: Zaznacz cały

cat2.sh plik1.txt plik2.txt plik3.txt
ma wyświetlić zawartość tych plików ale na początku ma się wyświetlić nazwa pliku i numer linii w poniższy sposób:

Kod: Zaznacz cały

/tmp/plik1.txt [1]: Linia A
/tmp/plik1.txt [2]: Linia B
/tmp/plik2.txt [1]: Linia M
/tmp/plik2.txt [2]: Linia N
/tmp/plik3.txt [1]: Linia X
/tmp/plik3.txt [2]: Linia Y
/tmp/plik3.txt [3]: Linia Z
Po co to? Otóż wprawdzie polecenie

Kod: Zaznacz cały

cat *.txt | grep tekst
wyświetla zawartość wszystkich wierszy w plikach tekstowych, które zawierają tekst "tekst", ale nie wiadomo, w którym pliku i w której linii jest ten tekst. Powyższy skrypt ma rozwiązać ten problem. Fajnie by było jakby skrypt potrafił uwzględniać podkatalogi.

Zrobiłem taki oto skrypt

Kod: Zaznacz cały

sed = test.txt | sed 'N; s/.*/test.txt [&/; s/^/     /; s/ *\(.\{6,\}\)\n/\1]:  /'
ale jak go wstawić do skryptu, żeby jako parametr działała dowolna nazwa pliku ze znakiem "*" włącznie? A może ktoś ma lepszy pomysł? Co Wy na to?

P. S.

Kod: Zaznacz cały

sed = $1 | sed 'N; s/.*/$1 [&/; s/^/     /; s/ *\(.\{6,\}\)\n/\1]:  /'
to niestety nie działa :-(
Ostatnio zmieniony 2010-06-08, 19:18 przez VoyciecH, łącznie zmieniany 1 raz.
"To, co dla jednego jest chlebem powszednim, dla innych może być olśniewającym objawieniem." (autor mi nieznany)
Inni wiedzą o Tobie więcej niż Ci się wydaje, ale mniej niż im się wydaje.
----------------
Moja stronka: http://linux.media-soft.pl/
Awatar użytkownika
mina86
Moderator
Posty: 3338
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [bash sed] Jak dodać nazwę pliku i nr linii do cat

Post autor: mina86 »

Kod: Zaznacz cały

grep -nH .\* nazwa-pliku
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
VoyciecH
Użytkownik
Posty: 143
Rejestracja: 2007-03-14, 15:20
Lokalizacja: Nysa (Śląski Rzym)
Kontakt:

Re: [bash sed] Jak dodać nazwę pliku i nr linii do cat

Post autor: VoyciecH »

I jak tu nie kochać tej wiewiórki :mrgreen: . Ja tu się męczę, kombinuję, a mina86 mi wypisuje jakąś skromną linijeczkę i żeby było śmiesznie to coś działa!!!

Stokrotne dzięki :ok:

Acha, co właściwie oznacza wpis ".\*"? (resztę chyba rozumiem)
"To, co dla jednego jest chlebem powszednim, dla innych może być olśniewającym objawieniem." (autor mi nieznany)
Inni wiedzą o Tobie więcej niż Ci się wydaje, ale mniej niż im się wydaje.
----------------
Moja stronka: http://linux.media-soft.pl/
Awatar użytkownika
mina86
Moderator
Posty: 3338
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] [bash sed] Jak dodać nazwę pliku i nr linii do c

Post autor: mina86 »

„.\*” jest interpretowane przez powłokę tak, że do grepa dociera „.*” (alternatywnie można napisać '.*'). Jest to wyrażenie regularne, do którego pasuje dowolny ciąg. Bez gwiazdki grep pomijałby puste linie.

Ale widać, że byłem niewyspany, bo tak naprawdę powinno być:

Kod: Zaznacz cały

grep -nH '' -- nazwa-pliku
Wszak w każdym ciągu istnieje podciąg pasujący do pustego wyrażenie regularnego.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
ODPOWIEDZ