Strona 1 z 1
sed, grep i znaki nowej linii
: 27 lis 2008, 17:30
autor: daris
Przykładowo mam taki plik:
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.
Odp: sed, grep i znaki nowej linii
: 27 lis 2008, 20:07
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

Odp: sed, grep i znaki nowej linii
: 27 lis 2008, 20:51
autor: benitecs
Odp: sed, grep i znaki nowej linii
: 27 lis 2008, 23:48
autor: gril
grep -v nie zadziała jeżeli cały tekst jest w jednej linii
Odp: sed, grep i znaki nowej linii
: 28 lis 2008, 16:22
autor: daris
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?
Odp: sed, grep i znaki nowej linii
: 28 lis 2008, 17:21
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++}}'
Odp: sed, grep i znaki nowej linii
: 28 lis 2008, 20:09
autor: daris
Dzięki leon1313 za pomoc

awk jest zdecydowanie lepszy od grepa
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:
& #8217; = '
(dałem spację pomiędzy & a # bo forum zamienia to na "normalne znaki"

Odp: sed, grep i znaki nowej linii
: 29 lis 2008, 11:29
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
Odp: sed, grep i znaki nowej linii
: 31 lip 2010, 18:15
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:
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

Odp: sed, grep i znaki nowej linii
: 31 lip 2010, 18:29
autor: ethanak
mortywd pisze:szczegóły musiałbym sam doczytać
Dobry pomysł...