Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Wycinanie okreslonych obszarow z tekstu  (Przeczytany 2440 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: 3056
  • 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 »