Nowe posty

xx postfix otrzymane emaile from z mojej domeny (2)
Dzisiaj o 07:59:13
xx Zmiana części pliku tekstowego (sed?) (5)
Wczoraj o 16:31:07
xx Problem z uruchomieniem Kali Linux! (6)
2019-11-16, 18:06:29
xx Prawy przycisk myszy - > Nowy plik (4)
2019-11-14, 21:35:55
xx Konto root i crontab backupu (2)
2019-11-13, 22:51:23
xx Najlepsze gry na Androida według Was (3)
2019-11-13, 14:04:31
xx jak w C++ robić operacje na pieniądzach (7)
2019-11-13, 14:00:35
xx [C++] Do czego potrzebny jest czas kompilacji (1)
2019-11-13, 13:57:53
xx chrome - urządzenie audio (4)
2019-11-10, 12:33:43
xx PORADNIK ! [Poszukiwanie bledow] (1)
2019-11-09, 17:54:50

Autor Wątek: [bash] Zastępowanie fragmentów tekstu  (Przeczytany 9253 razy)

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 30
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« dnia: 2005-11-23, 17:28:08 »
jak w temacie - sciagnalem pliki.. zkompilowalem i co teraz?? dodam ze jestem newbie

Offline

  • Users
  • Użytkownik
  • **
  • Wiadomości: 85
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #1 dnia: 2005-11-23, 13:13:51 »
Potrzebuje wprowadzić pewne zmiany w pliku konfiguracyjnym xml jednego z programów. I teraz moje pytanko jak wyciąć z czegoś takiego:

>
>
>

>
>
>
>

>
>
>
>


tylko całe 'Group name="ble2"'?

Próbowałem sed'em:
cat plik.xml | tr -d "n" | sed 's%.*%%g'
... ale niestety z racji, że "*" działa zachłannie to wycina wszystko od 'Group name="ble2"' do ostatniego "" czyli 'Group name="ble3"' też leci:(

Proszę o pomoc;)

Offline Grzegorz L

  • Users
  • Guru
  • *****
  • Wiadomości: 594
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #2 dnia: 2005-11-23, 17:15:16 »
Na szybko to mi cos takiego do glowy wpadlo:

cat plik.xml | awk '{gsub(//, " "); print}'

Offline

  • Users
  • Użytkownik
  • **
  • Wiadomości: 85
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #3 dnia: 2005-11-24, 10:36:04 »
2005-11-23 17:15:16 greg000 napisał:

> Na szybko to mi cos takiego do glowy wpadlo:
 >
 > cat plik.xml | awk '{gsub(//, " "); print}'
 >

Ale to mi wytnie tylko '' a ja chce całe:




Offline Grzegorz L

  • Users
  • Guru
  • *****
  • Wiadomości: 594
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #4 dnia: 2005-11-24, 16:20:31 »
#!/bin/ awk -f

BEGIN {

while ((getline a < "nazwapliku") > 0)
     {
       if (a ~ //)
           {
             getline a < "nazwapliku"
             getline a < "nazwapliku"
             getline a < "nazwapliku"
           }
      print a
     }
}

Offline

  • Users
  • Użytkownik
  • **
  • Wiadomości: 85
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #5 dnia: 2005-11-24, 18:50:30 »
2005-11-24 16:20:31 greg000 napisał:

> #!/bin/ awk -f
 >
 > BEGIN {
 >
 > while ((getline a < "nazwapliku") > 0)
 >      {
 >        if (a ~ //)
 >            {
 >              getline a < "nazwapliku"
 >              getline a < "nazwapliku"
 >              getline a < "nazwapliku"
 >            }
 >       print a
 >      }
 > }
 >

Ok a co jeśli ja nie znam liczby elementów? I moze być np. tak:








Owszem starczyła by teraz pętla while która by sprawdzała czy linia nie zawiera "
" ale to mnie i tak nie satysfakcjonuje bo w pliku xml wcale nie musi być znaków nowej lini... wszystko moze być w jednej a program i tak dobrze zinterpretuje plik. Czy nie da się tego jakoś lepiej zrobić? Bez ograniczania do wczytywania pojedynczych lini?

Offline Andrzej Oczkowicz

  • Users
  • Użytkownik
  • **
  • Wiadomości: 92
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #6 dnia: 2005-11-24, 19:34:52 »
witam:)

Może skożystasz z mojego programiku. Napisałem go do htmla ale do xml tez może być w pewnych zastosowaniach
Możesz pobrać go z http://freya.dsv.agh.edu.pl/~amg/download/progs/htmlp.tar.gz

a żeby wypakować tego taga "Group" zrób tak:
$./htmlp.bin -i test.xml -tagct Group -include_tag

żeby wypakować wszystkie tagi:
$./htmlp.bin -i test.xml -tagct Group -include_tag -tall

żeby wypakować wszystkie taga "Group" który ma parametr name="ble1" :
$./htmlp.bin -i test.xml -tagct Group -include_tag -cmp name ble1

aby wyswietlic pomoc:
żeby wypakować wszystkie tagi:
$./htmlp.bin -help

zresztą są źródła to w razie czego możesz sobie coś ulepszyć/przerobić :)

mam nadzieje że Ci sie to do czegoś przyda :)

pozdrawiam

Offline Grzegorz L

  • Users
  • Guru
  • *****
  • Wiadomości: 594
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #7 dnia: 2005-11-24, 19:38:59 »
> Owszem starczyła by teraz pętla while która by sprawdzała czy linia nie zawiera
 > ""

Oczywiscie, to co podalem to byl tylko przyklad. Petla while rozwiaze problem z wieloma wpisami.

>ale to mnie i tak nie satysfakcjonuje bo w pliku xml wcale nie musi
 > być znaków nowej lini... wszystko moze być w jednej a program i tak dobrze zinterpretuje plik.
 > Czy nie da się tego jakoś lepiej zrobić? Bez ograniczania do wczytywania pojedynczych lini?

Pewnie ze sie da zrobic, ale jak nie bedzie znaku konca lini i wszytko bedzie w jedej linijce to niestety sprawa sie komplikuje (chodz watpie zeby normalny plik konfiguracyjny byl tak napisany).

Offline

  • Users
  • Użytkownik
  • **
  • Wiadomości: 85
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #8 dnia: 2005-11-24, 22:27:25 »
2005-11-24 19:38:59 greg000 napisał:
 > Pewnie ze sie da zrobic, ale jak nie bedzie znaku konca lini i wszytko bedzie w jedej linijce
 > to niestety sprawa sie komplikuje (chodz watpie zeby normalny plik konfiguracyjny byl tak
 > napisany).
 
I właśnie o tą komplikacje mi chodzi. Program radzi sobie z brakiem znaków nowej lini więc chce aby skrypt też umiał sobie z tym poradzić... znasz jakiś sposób jak sobie z tą komplikacją poradzić?;)

> Może skożystasz z mojego programiku. Napisałem go do
> htmla ale do xml tez może być w pewnych zastosowaniach
To mi przypomina, że już dawno powinienem się tego języka nauczyć:| Tak to jest jak się poszło na uczelnie o której się nic nie wiedziało:/ Właśnie chodzi o rozwiązanie skryptowe ewentualnie jak się wkurze to się naucze C i napisze sobie cały program w tym języku:P (bo ten skrypt to zaledwie fragment dużo większego)

Offline Grzegorz L

  • Users
  • Guru
  • *****
  • Wiadomości: 594
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #9 dnia: 2005-11-25, 15:49:07 »
#!/bin/awk -f

BEGIN {
RS="[<>]"

plik="plik.xml"

while ((getline < plik) > 0)
    {
   if ($0 ~ /Group name="ble1"/)
       {
      while ($0 != "/Group")
        getline < plik
      getline < plik      
       }
   if (NF != 0)
       {
      print "<" $0  ">"
       }
    }
close (plik)
}

Polecam man awk :)

Offline

  • Users
  • Użytkownik
  • **
  • Wiadomości: 85
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #10 dnia: 2005-11-25, 18:40:14 »
Nie testowałem tego ale na pierwszy rzut oka nadal działa to na zasadzie wczytywania pojedynczych lini i nadal nie rozwiązuje problemu a co by było gdyby w jednej lini znajdowało się coś takiego:



Wtedy niestety skrypt ten leży:(

No chyba, że się myle to mnie poprawcie

Offline xis

  • Global Moderator
  • Guru
  • *****
  • Wiadomości: 1049
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #11 dnia: 2005-11-25, 23:44:51 »
Hej,
Możesz spróbować tak:
cat plik.xml | tr -d "n" | sed 's%[^>]*[^<]*%%g'

Oczywiście można to dopucować żeby wyciął też spacje, ale powinno działać.
Everything should be made as simple as possible, but not simpler
-- Albert Einstein

Offline Grzegorz L

  • Users
  • Guru
  • *****
  • Wiadomości: 594
    • Zobacz profil
[bash] Zastępowanie fragmentów tekstu
« Odpowiedź #12 dnia: 2005-11-26, 18:50:09 »
2005-11-25 18:40:14 xamil napisał:

> Nie testowałem tego ale na pierwszy rzut oka nadal działa to na zasadzie wczytywania
 > pojedynczych lini i nadal nie rozwiązuje problemu a co by było gdyby w jednej lini znajdowało
 > się coś takiego:
 >
 >
 >
 > Wtedy niestety skrypt ten leży:(
 >
 > No chyba, że się myle to mnie poprawcie

Mylisz sie wiec cie poprawiam. Wszystko dziala jak ma.
Niz napiszesz, ze cos nie dziala to najpierw to sprawdz.