[BASH] blokken tekst opdelen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
Hoi,

Ik heb een bestand met daarin gegevens die in blokken verdeeld zijn. Een blok gegevens begint telkens met het
SOH (Start of Header) controle karakter en eindigt met een ETX (End of text) karakter. Nu zou ik deze blokken text eruit moeten kunnen halen.

Nu heb ik al zitten prullen met awk maar het lukt mij niet voldoende.

awk '/\1/,/\3/' bestand > bestand2

Als iemand mij verder zou kunnen helpen, dat zou fantastisch zijn.

Tnx.

Acties:
  • 0 Henk 'm!

  • ThomVis
  • Registratie: April 2004
  • Laatst online: 11-09 21:04

ThomVis

Detected rambling:

Even snel in elkaar gedraait, zal wel syntax errrors hebben:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh

Export=No

cat infile.ext | while read LINE; do
  if [[ $LINE == *ETX* ]]then
     Export=No
  fi

  if [[ $Export == Yes ]]then
    echo -e "$LINE">>"infile.ext"
  fi
  
  if [[ $LINE == *SOH* ]]then
     Export=Yes
  fi
done

You don't have to know how the computer works, just how to work the computer.


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 09:18
@ThomVis: je oplossing werkt niet, want de tekst bevat de SOH en ETX control characters, dus niet gewoon de tekst "SOH" of "ETX".

@TS: mag het ook met sed?
code:
1
sed -n '/\o01/,/\o03/p' bestand > bestand2

(\o01 en \o03 voor de octal code voor SOH en ETX)

Hou er rekening mee dat de control codes ook in bestand2 komen, dus alles tussen een SOH en ETX, inclusief de SOH en ETX.

Edit:
Ach, met awk kan het ook:
code:
1
awk '/\x01/,/\x03/{print}' bestand > bestand2

(\x01 en \x03 voor de hex code voor SOH en ETX. Geen idee waarom octaal niet gaat.)

[ Voor 25% gewijzigd door vanaalten op 22-04-2011 16:58 ]


Acties:
  • 0 Henk 'm!

  • ThomVis
  • Registratie: April 2004
  • Laatst online: 11-09 21:04

ThomVis

Detected rambling:

vanaalten schreef op vrijdag 22 april 2011 @ 16:52:
@ThomVis: je oplossing werkt niet, want de tekst bevat de SOH en ETX control characters, dus niet gewoon de tekst "SOH" of "ETX".
Daar had ik even overheen gelezen, my bad.

You don't have to know how the computer works, just how to work the computer.


Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
vanaalten schreef op vrijdag 22 april 2011 @ 16:52:
@ThomVis: je oplossing werkt niet, want de tekst bevat de SOH en ETX control characters, dus niet gewoon de tekst "SOH" of "ETX".

@TS: mag het ook met sed?
code:
1
sed -n '/\o01/,/\o03/p' bestand > bestand2

(\o01 en \o03 voor de octal code voor SOH en ETX)

Hou er rekening mee dat de control codes ook in bestand2 komen, dus alles tussen een SOH en ETX, inclusief de SOH en ETX.

Edit:
Ach, met awk kan het ook:
code:
1
awk '/\x01/,/\x03/{print}' bestand > bestand2

(\x01 en \x03 voor de hex code voor SOH en ETX. Geen idee waarom octaal niet gaat.)
Tnx, de awk werkt. Is het enkel mogelijk om dit in 1 bestand te gieten? Ik moet namelijk het aantal bytes van 1 blok tellen, en dit getal vooraan zetten.

Ik heb dus een text:

<SOH>
data data data data
data data data
<ETX><SOH>
data data data data
data
<ETX>

en ik moet dit verkrijgen:
<aantal bytes (8 karakters met leading zero's)><00 (gewoon het ASCII getal 00)><SOH>data data data data<ETX>

[ Voor 21% gewijzigd door ZodiacQ op 26-04-2011 11:19 ]


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 09:18
Dan maak je het probleem al gelijk een flink stuk ingewikkelder. Het gaat dan van een one-liner naar een compleet programma. Kan natuurlijk wel, maar om dat zo even uit m'n mouw te schudden gaat wat ver.

In principe is de structuur van ThomVis z'n programma een leuk begin. Je hebt iets nodig dat de SOH en ETX codes detecteert en met de data ertussen iets slims doet, eerst de boel opslaan/tellen bij een ETX al het opgeslagen spul weer uitgeven.

Moeilijkheid is dat de SOH en ETX codes binnen je awk programma niet zelfstandige regels zijn: in principe eindigt de regel bij een return-code. Na de SOH komt er wat tekst en een return, na de ETX komt zo te zien alweer een nieuwe SOH, wat tekst en een return.

Zelf zou ik er een tweetrapsracket van maken:
1) een awk script die <SOH> vervangt door een complete regel "SOH_CODE\n" en <ETX> door een complete regel "ETX_CODE\n" (dus inclusief die enters!). Vanaf daar heb je gewoon puur een ascii file en is je data regel-gescheiden van de 'control codes'.
2) een awk script die die pure ascii file verwerkt en de gewenste output maakt.

Acties:
  • 0 Henk 'm!

  • ZodiacQ
  • Registratie: Maart 2009
  • Laatst online: 27-01 20:51
vanaalten schreef op dinsdag 26 april 2011 @ 13:30:
Dan maak je het probleem al gelijk een flink stuk ingewikkelder. Het gaat dan van een one-liner naar een compleet programma. Kan natuurlijk wel, maar om dat zo even uit m'n mouw te schudden gaat wat ver.

In principe is de structuur van ThomVis z'n programma een leuk begin. Je hebt iets nodig dat de SOH en ETX codes detecteert en met de data ertussen iets slims doet, eerst de boel opslaan/tellen bij een ETX al het opgeslagen spul weer uitgeven.

Moeilijkheid is dat de SOH en ETX codes binnen je awk programma niet zelfstandige regels zijn: in principe eindigt de regel bij een return-code. Na de SOH komt er wat tekst en een return, na de ETX komt zo te zien alweer een nieuwe SOH, wat tekst en een return.

Zelf zou ik er een tweetrapsracket van maken:
1) een awk script die <SOH> vervangt door een complete regel "SOH_CODE\n" en <ETX> door een complete regel "ETX_CODE\n" (dus inclusief die enters!). Vanaf daar heb je gewoon puur een ascii file en is je data regel-gescheiden van de 'control codes'.
2) een awk script die die pure ascii file verwerkt en de gewenste output maakt.
OK dan doe ik het zo, ik was al aan het kijken naar een awk-script, maar ik vond niet echt iets dat me kon helpen. Toch bedankt.

Acties:
  • 0 Henk 'm!

  • MartinMeijerink
  • Registratie: Juli 2008
  • Laatst online: 05-10 15:01

MartinMeijerink

Computerrorist

Wat ik nog weleens doe, is alles omzetten naar hexadecimaal, dan allerlei reguliere expressies erop los laten, en als laatste de hexadecimale codes weer omzetten naar de oorspronkelijke vorm...

Dus je hebt bijv. dit in bestand "bestand"
code:
1
<SOH>mekker<ETX><SOH>blaat<ETX>


Dan doe je:
xxd -ps -c1 bestand|sed s/01/0001/|xxd -ps -r


En dan komt er dus uit:
code:
1
<00><SOH>mekker<ETX><00><SOH>blaat<ETX>


Misschien is het een idee op het ook op zo'n manier te doen...

An unbreakable toy is useful to break other toys

Pagina: 1