Vraag & Antwoord

OS Linux

Sed howto?

9 antwoorden
  • Ik zit met het volgende probleem. Deze regel:[code:1:fc7348e087] x11-themes/gnome-themes-2.4.0 [/code:1:fc7348e087]moet worden [code:1:fc7348e087] gnome-themes[/code:1:fc7348e087] Dat eerste stukje hak ik eraf met [b:fc7348e087]cut -d / -f2[/b:fc7348e087] (-d / is eraf hakken t/m /, f2 is tweede deel houden). Voor het tweede deel werkt dat niet, want dan houdt ik alleen gnome over. Nu kan er heel erg veel met [b:fc7348e087]sed[/b:fc7348e087], maar ik weet niet hoe? Als iemand een pasklare oplossing heeft, vindit ik het prima, maar liever nog een verschrikkelijk goede howto.
  • Misschien awk een oplossing: x11-themes/gnome-themes-2.4.0 |awk -F- '{print $2)' --> gnome-themes-2.4.0 |awk -F- '{print $1-$2}'-->gnome-themes -F is de field-seperator. In dit geval is de field seperator '-', vervolgens geef je met '{print $x)' (waarbij x een getal) string x weer. De laatste is dus beetje 'tricky' $1 is gnome en $2 is themes. Daar plak je dus gewoon weer '-' tussen. Met sed weinig ervaring. Werkt man sed niet (of is die onduidelijk, begrijp die man pages ook bijna nooit :wink: MVGR, René
  • Sed wordt meestal gebruikt om data te veranderen door er reguliere expressies overheen te gooien (hoewel ik gehoord heb van iemand die er een Tetris in heeft geprogrammerd :)). Dit geeft bijvoorbeeld het gewenste resultaat: [code:1:e7dbb16325]echo 'x11-themes/gnome-themes-2.4.0' | sed 's/^.*\/\([^-]\+-[^-]\+\).*$/\1/'[/code:1:e7dbb16325] Het enige irritante is dat je steeds allemaal karakters die voor de shell ook iets betekenen moet escapen...
  • [quote:c66efae3e7="intri"]Sed wordt meestal gebruikt om data te veranderen door er reguliere expressies overheen te gooien (hoewel ik gehoord heb van iemand die er een Tetris in heeft geprogrammerd :)). Dit geeft bijvoorbeeld het gewenste resultaat: [code:1:c66efae3e7]echo 'x11-themes/gnome-themes-2.4.0' | sed 's/^.*\/\([^-]\+-[^-]\+\).*$/\1/'[/code:1:c66efae3e7] Het enige irritante is dat je steeds allemaal karakters die voor de shell ook iets betekenen moet escapen...[/quote:c66efae3e7] Dit werkt idd, maar ik snap er geen hout van. :-? Kan iemand mij dit ook nog uitleggen?
  • Het kan ook makkelijker met sed sed 's/x11-themes\/gnome-themes-2.4.0/gnome-themes/g' origineel > nieuw_bestand Wat je nu doet: - je roept sed aan :wink: - dan krijg je 's/ - vervolgens typ je de tekst die je wilt vervangen (als je een / wilt, doe je \/, dat is een backslash gevolgd door een slash) - dan type je weer een slash (/) en daarachter de tekst die je daarvoor in de plaats wilt. - je eindigt met /g' - je geeft het bronbestand op en - daarachter het nieuwe gewijzigde bestand Je kan leuke dingen doen met sed. Zo heb ik een paar jaar geleden een script gemaakt dat al mijn winamp playlists omzette in playlists voor linux (\ vervangen door / en mountpoints aanmaken, etc.) Succes!
  • [quote:9a6e288f9d="water"]Dit werkt idd, maar ik snap er geen hout van. :-? Kan iemand mij dit ook nog uitleggen?[/quote:9a6e288f9d] Ik zal het proberen :) Een basis sed regel met de vorm s/text1/text2/ vervangt text1 door text2. Het kan echter een stuk gecompliceerder. Zonder de BASH-escapes ziet mijn regel er als volgt uit: [code:1:9a6e288f9d] s/^.*\/([^-]+-[^-]+).*$/\1/ [/code:1:9a6e288f9d] - De ^ geeft het begin van de text aan - Daarna volgen 0 of meer arbitraire karakters (".*", een punt staat voor een arbitrair karakter en een * betekent dat het voorafgaande 0 of meer keer achter elkaar moet voorkomen) gevolgd door een / (die ge-escaped moet worden door \ omdat / al de verschillende delen van de regel scheidt) - Nu komen er 1 of meer tekens die geen '-' zijn, een - en weer 1 of meer tekens die geen '-' zijn. Waarom dit tussen () staat leg ik hieronder uit. - Tenslotte weer 0 of meer arbitraire karakters gevolgd door het einde ($) De vervangende tekst is \1. Dit staat voor het gedeelte dan tussen () staat aan de linkerkant van de regel. Dus het gedeelte van 2 woorden met een streepje ertussen. Ik hoop dat het een beetje duidelijk is. Ben niet zo goed in uitleggen :D En ik raadt je zeker aan om de sed manual ([url]http://www.gnu.org/manual/sed-3.02/sed.html[/url]) te lezen! Sowieso is het erg handig om die GNU manuals te lezen om je systeem door en door te kennen.
  • Dan 3x zeer aandachtig lezen begint het iig te dagen. Maar wat zijn "arbitraire tekens"? Ik heb overigens zelf inmiddels dit gevonden: http://sed.sourceforge.net/#docs (uit de manpage, in Konsole, met de rechtermuisknop selecteren: link openen in webbrowser! Kijk, dan noem ik nu intergratie :D ) Overigens is dit nog niet helemaal de juiste oplossing, omdat het aantal - dat gehandhaaft moet blijven, varieert. Ik moet er naar toe dat de volgorde van de letters wordt omgedraaid en vervolgens alles voor de eerste - wordt verwijderd en vervolgens de letters weer worden omgedraaid.
  • [quote:845426d167="water"]Dan 3x zeer aandachtig lezen begint het iig te dagen. Maar wat zijn "arbitraire tekens"? [/quote:845426d167] Willekeurige tekens. Max
  • Aan intri: Kan je mij uitleggen wat 't verschil is tussen de manier van jou (met reguliere expressie) en mijn manier (zonder regulier expressie). Heeft jouw manier nog bepaalde voordelen?

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.