[sed] Karakters verdwijnen/veranderen.

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik heb een simpel bash-scriptje, dat een aantal pagina's download, en de titel van de pagina's omzet naar een sql commando, zodat ik het geheel in een database kan stoppen.

De titels van de pagina zijn in het formaat
<title>FOK!forum / Bekijk profiel van username<\/title>
waarbij ik geïnteresseerd ben in de username.

Nu dacht ik dat simpel op te lossen met een combinatie van grep en sed, maar daarbij verdwijnen/veranderen er letters in het resultaat:
Bash:
1
2
3
4
grep "Bekijk profiel van " $userId | sed -E "s\
/^  <title>FOK!forum \/ Bekijk profiel van (.*)<\/title>/\
INSERT INTO users (id, username) VALUES($userId, '\1')\;\
/g" >> users.sql


Een kleine greep uit het resulterende users.sql:
INSERT INTO users (id, username) VALUES(50, 'Lobo Guarr');
INSERT INTO users (id, username) VALUES51, 'Wim Cx');
INSERT INTO users (id, username) VALUE84, 'P.an');
INSERT INTO users (id, username) VALUE8118, 'Roodaapy');
Dit vind ik heel raar, en ik vind er ook niets over terug op google/got. Is iemand bekend met dit probleem?

Ik ontken het bestaan van IE.


  • JeroenE
  • Registratie: Januari 2001
  • Niet online
Volgens mij moet het sed commando er zo uit zien:
code:
1
sed -e "s/^<title>FOK\!forum \/ Bekijk profiel van \(.*\)<\/title>/INSERT INTO users(id, username) VALUES($userId, '\1');/g"
maar dat is verder niet echt het probleem. Waarschijnlijk staan er in $userId vage dingen (backspaces?) die eea om zeep helpen in de output.

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Dat is niet het probleem. $userId is een numerieke waarde, die ik met een loopje vanuit bash zelf zet, dit is dus gegarandeerd numeriek.

Ik ontken het bestaan van IE.


  • JeroenE
  • Registratie: Januari 2001
  • Niet online
Misschien moet je meer van je code laten zien?

Wat krijg je te zien als je deze code in een scriptfile zet en uitvoert? (Let op, er worden files aangemaakt en verwijderd etc dus probeer dit in een lege dir als je niets kwijt wil raken)

code:
1
2
3
4
5
6
7
8
9
#!/bin/sh
rm -f users.sql
for userid in 1 2 3;
do
    echo "<title>FOK!forum / Bekijk profiel van user$userid</title>" > $userid.txt
    grep "Bekijk" $userid.txt |sed -e "s/^<title>FOK!forum \/ Bekijk profiel van \(.*\)<\/title>/INSERT INTO users(id, username) VALUES($userid, '\1');/g" >>users.sql
    rm -f $userid.txt
done
cat users.sql

Verwijderd

Ten eerste, kijk uit met de dubbele quotes, de shell kan de '*' van .* interpreteren onder sommige omstandigheden. Wat doet de -E optie (mijn sed kent deze niet). Je kunt in sed als scheidingsteken van de substitute expressie alles gebruiken wat je wilt, ook s#foo#bar# of s,foo,bar, werkt (dat scheelt je in in combinatie met HTML wat escapen).

Ik heb weleens gehad dat karakters niet zozeer verdwenen, maar dat ze overschreven werden. Als de invoer een '\r' bevat, dan krijg je dat. Dat commando zet de cursor namelijk naar het begin van de regel. Dus 'blaat\roink' levert op je scherm 'oinkt'. Strip de invoer dus eventueel eerst van deze tekens (| tr -d '\r'). Misschien dat ze ergens worden meegenomen en dat het resultaat wat je ziet zo tot stand is gekomen. (Ik moet toegeven dat me het niet héél waarschijnlijk lijkt in dit geval, maar zonder meer shell script blijft het giswerk).

[ Voor 12% gewijzigd door Verwijderd op 22-10-2005 11:16 ]


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
De -E optie is een optie van de FreeBSD implementatie van sed, waarbij je gebruik kunt maken van de moderne regex.

Er zitten geen \r of andere rare tekens in die variabelen.

De rest van het shellscript is totaal oninteressant voor dit probleem. Dat is gewoon een loopje wat $userId ophoogt, en het juiste bestand download, waaruit dus de titel wordt gehaald.

Ik heb voor de zekerheid ook even één van de bestanden waarbij het fout ging bekeken, en daar zitten echt geen rare dingen in, en natuurlijk al helemaal niet in het <title> element.

Ik ontken het bestaan van IE.

Pagina: 1