sed, grep i znaki nowej linii

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
daris
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 26 lut 2007, 17:20
Płeć: Mężczyzna
Wersja Ubuntu: 15.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64

sed, grep i znaki nowej linii

Post autor: daris »

Przykładowo mam taki plik:

Kod: Zaznacz cały

<h2>
jakiś tekst
</h2>
jak więc pobrać tekst będący pomiędzy <h2> a </h2> ? Grep działa dobrze tylko wtedy jak wszystko jest w jednej linijce, sed tak samo. Jak więc to zrobić? I nie chodzi mi o to żeby tylko usunąć h2 bo ten przytoczony tekst to jest tylko niewielki fragment pliku.
:craz:
gril
Sędziwy Jeż
Sędziwy Jeż
Posty: 39
Rejestracja: 09 lis 2008, 00:47
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME

Odp: sed, grep i znaki nowej linii

Post autor: gril »

poczytaj o wyrażeniach regularnych i spróbuj jeszcze raz z sedem (lub awk)

PS
a jeżeli tekst jest bardziej skomplikowany to lex :)
Awatar użytkownika
benitecs
Piegowaty Guziec
Piegowaty Guziec
Posty: 15
Rejestracja: 31 lip 2007, 23:33
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: Xfce
Kontakt:

Odp: sed, grep i znaki nowej linii

Post autor: benitecs »

Kod: Zaznacz cały

grep -v 'h2>$' /scieżka/do/pliku
gril
Sędziwy Jeż
Sędziwy Jeż
Posty: 39
Rejestracja: 09 lis 2008, 00:47
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME

Odp: sed, grep i znaki nowej linii

Post autor: gril »

grep -v nie zadziała jeżeli cały tekst jest w jednej linii
Awatar użytkownika
daris
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 26 lut 2007, 17:20
Płeć: Mężczyzna
Wersja Ubuntu: 15.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Odp: sed, grep i znaki nowej linii

Post autor: daris »

benitecs pisze:

Kod: Zaznacz cały

grep -v 'h2>$' /scieżka/do/pliku
Widzę że nie zrozumieliście o co mi chodziło - takie coś jest za proste. Chodzi o to że w pliku nie ma samego <h2> tylko jest mnóstwo kodu html. To z tym h2 to był akurat tylko przykład.

Z tym wcześniejszym częściowo sobie poradziłem, tak wyglądał cały tekst:

Kod: Zaznacz cały

<dużo kodu html>
<div id="tex" style="coś tam">
jakiś tekst

jakiś tekst

jakiś tekst

</div>
<div id="tex2" style="coś tam">

jakiś tekst

jakiś tekst

jakiś tekst

</div>
<kod html>
Potrzebne mi było pobrać tekst pomiędzy jednym i drugim div'em. Poradziłem sobie grepując linie z
i zamieniając <div ...> na spację ;) Teraz mam wszystkie linie z
- a jak pobrać tylko zawartość pierwszego div'a?
:craz:
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: sed, grep i znaki nowej linii

Post autor: leon1313 »

eeee, grep i sed jest dla lamerów :-)

Kod: Zaznacz cały

cat wejscie.txt | awk '{ if(/<\/div/){a=0}; if(a==1){print $0}; if(/<div/){a=1}}'
jak chcesz mieć też linie z div-em, to zamień trzecie wyrażenie w awk z pierwszym ( średniki oddzielają wyrażenia). Jak nie chcesz mieć końca linii, to daj printf zamiast print. Zawartość z pierwszego diva-a?

Kod: Zaznacz cały

cat wejscie.txt | awk 'BEGIN{a=0}{ if(/<\/div/){a++}; if(a==1){print $0}; if(/<div/){a++}}'
Pamiętaj, że to tylko przykład..pisany przy browarze :-)
A gdybyś chciał zawartośc dowolej div-y , zmień ll==1 na inną wartość:

Kod: Zaznacz cały

cat wejscie.txt | awk 'BEGIN{a=0; ll=0}{ if(/<\/div/){a=0}; if((a==1) && (ll==1)){print $0}; if(/<div/){a=1; ll++}}'
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
Awatar użytkownika
daris
Sędziwy Jeż
Sędziwy Jeż
Posty: 66
Rejestracja: 26 lut 2007, 17:20
Płeć: Mężczyzna
Wersja Ubuntu: 15.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Odp: sed, grep i znaki nowej linii

Post autor: daris »

Dzięki leon1313 za pomoc ;) awk jest zdecydowanie lepszy od grepa :craz:

Jeszcze małe pytanko: jak zamienić \n\n na \n ? (chodzi o usunięcie podwójnych znaków nowej linii). W PHP to było łatwe, a jak w bashu?

PS. Jest jakaś funkcja/program zamieniający html'owe znaki na ich normalne odpowiedniki czy mam to robić sed'em ;) ? Chodzi o np to:

Kod: Zaznacz cały

it& #8217;s alright
& #8217; = '
(dałem spację pomiędzy & a # bo forum zamienia to na "normalne znaki" ;)
:craz:
Awatar użytkownika
leon1313
Zakręcona Traszka
Zakręcona Traszka
Posty: 668
Rejestracja: 02 sty 2006, 19:35
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: sed, grep i znaki nowej linii

Post autor: leon1313 »

Musiałbym mieć plik wejściowy, aby na nim testować. AWK jest fajnym narzędziem, ale jeśli chcesz się bawić w poważniejsze parsery, to ukłoń się w kierunku perla lub ruby'ego
"Poza tym dostałeś PLONKa i zabraniam Ci pisać na te grupe!!! Powiedziałem PLONK i sie zamknij i nawet nie knuj rzeby mi odpisywać! Zabraniam!!!"
mortywd
Sędziwy Jeż
Sędziwy Jeż
Posty: 35
Rejestracja: 30 lis 2007, 19:22
Płeć: Mężczyzna
Wersja Ubuntu: 8.10
Środowisko graficzne: GNOME

Odp: sed, grep i znaki nowej linii

Post autor: mortywd »

W AWK można ustawić separator pól, co więcej można ustawić wyrażenie regularne jako separator pól, więc powinno się dać ustawić, żeby separatorem pól wejściowych był dowolny tag html - czyli "<cokolwiek>" - szczegóły musiałbym sam doczytać ("Efektywne programowanie w AWK", gdzieś w sieci) i potestować.
Jeśli chodzi o usunięcie pustych linii:

Kod: Zaznacz cały

awk 'NF==0 {next}; {print}
wypisuje wszystkie linie, które zawierają conajmniej jedno pole (t.j. znak inny niż biały). Powinno zadziałać, jeśli nie - spróbuj NF==1.
Objaśnienia:
* NF - liczba pól bieżącego rekordu
* next - przejdź do analizy następnej linii
przerzuć wspomniany podręcznik - jest niezły i po polsku, sam z niego ciągle korzystam, choć nigdy nie przeczytałem od deski do deski :wall:
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Odp: sed, grep i znaki nowej linii

Post autor: ethanak »

mortywd pisze:szczegóły musiałbym sam doczytać
Dobry pomysł...
Кто жопой родился, чижиком не помрёт
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 67 gości