Strona 1 z 1

sed, grep i znaki nowej linii

: 27 lis 2008, 17:30
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.

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

Kod: Zaznacz cały

grep -v 'h2>$' /scieżka/do/pliku

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
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?

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 :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" ;)

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:

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:

Odp: sed, grep i znaki nowej linii

: 31 lip 2010, 18:29
autor: ethanak
mortywd pisze:szczegóły musiałbym sam doczytać
Dobry pomysł...