Nowe posty

Autor Wątek: Wycinanie okreslonych obszarow z tekstu  (Przeczytany 2473 razy)

edytuj_profil

  • Gość
Wycinanie okreslonych obszarow z tekstu
« dnia: 2015-07-28, 11:39:19 »
Hej,

Mierze sie chyba z dosc prostym problemem, ale niestety stanalem w miejscu. Mianowicie mam przykladowo taki tekst

Index: jakies znaki +flaga
wiersz 1
wiersz 2
...

Index: jakies znaki
wiersz 1
wiersz 2
...
Index: jakies znaki +flaga
wiersz 1
wiersz 2
...

Zalezy mi na wycieciu wierwszy pomiedzy indexami, ale tylko tymi, ktore zawieraja +flaga. Lub usunac te indexy (i wszystkie wiersze do nastepnego indexu), ktory nie zawiera np. +flaga (taki przyklad, dowolny wzorzec moze tutaj byc, jednak regula jest taka, ze linia z Index: zawiera badz nie ten wzorzec).

Czy moglby ktos podsunac jakis pomysl?

lukas - ospulse.pl

  • Gość
Odp: Wycinanie okreslonych obszarow z tekstu
« Odpowiedź #1 dnia: 2016-03-16, 22:15:01 »
Tu masz z grep'em, który dodatkowo usuwa Ci puste wiersze.
#!/bin/bash

while read line
do

   echo $line | grep -q '^$' \
   && continue

   echo $line | grep -q '+flaga' \
   && flaga='true'
 
 
   if [ "$line" = '...' ]
   then
 
   if [ "$flaga" = 'true' ]
   then

      for(( i=0 ; i < ${#tab[*]} ; i++ ))
      do
         echo ${tab[i]}
      done

   echo '...'

   fi

   unset flaga
   unset tab[*]
   unset i
   continue

   fi
 
tab[i]=$line
i=$((++i))

done < plik

Tutaj masz bez grepów i potoków, które wywołują podpowłoki, a te spowalniają skrypty.
#!/bin/bash

while read line
do

   for word in $line
   do
     
      if [ "$word" = '+flaga' ]
      then
         flaga='true'
      fi
 
   done
 
   if [ "$line" = '...' ]
   then
 
   if [ "$flaga" = 'true' ]
   then

      for(( i=0 ; i < ${#tab[*]} ; i++ ))
      do
         echo ${tab[i]}
      done

   echo '...'

   fi

   unset flaga
   unset tab[*]
   unset i
   continue

   fi
 
tab[i]=$line
i=$((++i))

done < plik

Skrypt znaki trzech kropek traktuje jako separator. Jakakolwiek zmiana spowoduje niepoprawne działanie skryptu. Jak ktoś chce wyjaśnienia w komentarzach, to pisać...

PS 1 Z dobry ponad rok będzie jak nie programowałem i trochę mi to zajęło tj. godzinkę  ;D
PS 2 Tak wiem, temat stary, ale chciałem trochę wysilić to co pozostało pod garnkiem.
« Ostatnia zmiana: 2016-03-16, 22:25:58 wysłana przez lukas - ospulse.pl »

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3066
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Wycinanie okreslonych obszarow z tekstu
« Odpowiedź #2 dnia: 2016-03-17, 08:44:44 »
Product placement w loginie a tam pierwszy strzał: reklama Ubuntu 10.04 :) Powtórzona w "O mnie". Rly, od 6 lat nie zaktualizowałeś systemu?
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

lukas - ospulse.pl

  • Gość
Odp: Wycinanie okreslonych obszarow z tekstu
« Odpowiedź #3 dnia: 2016-03-21, 14:33:28 »
Nie wiem czy to przez to, że jestem leniwy, czy czas mi dziś na to nie pozwala ;) Przymierzam się do Kubuntu albo czegoś z nowym KDE bo Unity i to co Canonical dziś wyprawia, nie bardzo mi odpowiada... A Debian pogniewał się na mnie- przy dwóch podejściach nie dał się zainstalować...
« Ostatnia zmiana: 2016-03-21, 14:36:22 wysłana przez lukas - ospulse.pl »