Strona 1 z 1

Jak wyciąć blok tekstu - wyraŻenia regularne

: 29 listopada 2008, 00:05
autor: Inquistor
Generalnie za pomocą grep można w bardzo ładny sposób otrzymać linijki tekstu, ale jakiego narzędzia mam użyć kiedy chce wyciąć np taki blok tekstu:

Kod: Zaznacz cały

[tekst]
tekst tekst tekst
tekst tekst tekst
tekst tekst tekst
tekst tekst tekst
[/tekst]
Chciałbym jeszcze zaznaczyć, że ilość samego tekstu w środku jest różna. Chyba najlepszym rozwiązaniem by było żeby polecenie przechwytywało tekst, który się znajduje między znacznikami [tekst] [/tekst].

Jakieś sugestie?

: 29 listopada 2008, 00:43
autor: dsue
Pewnie można dużo prościej, ale:

Kod: Zaznacz cały

cat plik.txt | awk 'BEGIN { FS="\[tekst]" } ; { print $1 }' | awk ' BEGIN { FS="\[/tekst]" } ; { print $1 }'
też działa (za wyjątkiem MacOSX - tam bash/awk ma swoje humory).

Pozdrawiam

: 29 listopada 2008, 01:17
autor: snah
Polecam seda:

Kod: Zaznacz cały

sed -n '/\[tekst]/,/\[\/tekst]/'p plik.txt
Prostszy przykład:

Kod: Zaznacz cały

sed -n '2,5'p plik.txt
Wypisze linie od 2 do 5. Za 2 wstawiamy wyrażenie regularne /poczatek/, za 5 /koniec/. Jako że '[' i '/' mają specjalne znaczenie, musimy je poprzedzić '\'.

: 29 listopada 2008, 10:18
autor: Inquistor
Pierwsza metoda u mnie nie działa, natomiast ta z sedem jest dobra.

Dziękuję za pomoc :mrgreen:

EDIT:
Jeszcze jedna sprawa, sedem można spokojnie usuwać puste linie, ale jak usunąć puste znaki?
Np. jak mam:

Kod: Zaznacz cały

tekst]
dsasdsad
     sadsad
sadsa
[/tekst]
żeby pousuwało puste znaki z początku linii. Coś ala trim z php?

EDIT:
Rozwiązanie ;-)

Dla pustych znaków spacji:

Kod: Zaznacz cały

sed -e 's/^[ ]*//g' plik.txt
Dla znaków tabulacji:

Kod: Zaznacz cały

sed -e 's/^[\t]*//g' plik.txt

: 29 listopada 2008, 13:14
autor: snah
Inquistor pisze:EDIT:

Rozwiązanie ]sed -e 's/^[ ]*//g' plik.txt[/code]
Dla znaków tabulacji:

Kod: Zaznacz cały

sed -e 's/^[\t]*//g' plik.txt
Mnie działa bez '[',']','g':

Kod: Zaznacz cały

sed -e 's/^\t*//' -e 's/^ *//' plik.txt
Wykorzystując zbiór znaków ([]):

Kod: Zaznacz cały

sed -e 's/^[ \t]*//' plik.txt
[abc] oznacza dowolny znak ze zbioru znaków, czyli a albo b albo c. 'g' na końcu string replace to zamienienie każdego znalezionego wzorca w jednej linii - sed analizuje dane linia po linii.