[Ksh/sed] Wijzigen onbekende string?

Pagina: 1
Acties:

  • teigetjuh
  • Registratie: September 2000
  • Niet online
Ik kan best wel een beetje basis scripten, maar sed is niet direct mijn vriend.
Ik ben bezig met een ksh-script wat een aantal files moet wijzigen.
Ik gebruik een "for i in .... " constructie om de diverse files te wijzigen.

Het probleem:
Ik heb een bestand dit bevat een regel met een bepaalde string. Deze string is 8 tot 10 karakters lang, maar staat alleen op een bepaalde regel. Het regel nummer is ook bekend (zeg maar regel 13). Ik wil deze string wijzigen naar iets wat wel bekend is.
Naar mijn idee zou het dat iets moeten worden van:
code:
1
sed -e '13s/*/nieuwetext/g' bestand.oud > bestand.nieuw

Helaas kan het voorkomen dat er een * in de te vervangen tekst voorkomt en dat blijft er dus een deel staan.

Hoe kan ik ongeacht wat er staat een nieuwe tekst over de bestaande heenzetten? Of de regel verwijderen en een nieuwe invoegen?

Ik heb gezocht, maar bijna alle voorbeelden gaan er vanuit dat je weet wat je gaat vervangen en dat het gewone tekst is.

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
s/*/ietsanders werkt niet. Het is een reguliere expressie, geen globbing, en bij een regexp betekent * "0 of meer instanties van het voorgaande", een quantifier dus, en die heeft op zichzelf geen enkele betekenis. In combinatie met de wildcard voor "elk karakter", de "." zou het moeten werken, s/.*/jenieuwetekst/ dus, de /g modifier kun je ook weglaten, .* matcht alles, dus aangeven dat je indien mogelijk vaker wil matchen op die ene regel is dus niet nodig.

  • teigetjuh
  • Registratie: September 2000
  • Niet online
Dank je, ik ga het morgen proberen.
Ik had een aantal variaties uitgeprobeerd, of ik die door jou aangegeven heb geprobeerd, weet ik helaas niet meer. Ik laat morgen meer weten.

  • teigetjuh
  • Registratie: September 2000
  • Niet online
Ik heb het uit geprobeerd. Met enkel de punt als wildcard wordt alleen het eerste teken gewijzigd.
Maar de opmerking heeft me wel aan het denken gezet en ik ben tot de volgende werkende oplossing gekomen:
code:
1
sed -e '13s/^.*$/nieuwestring/' Bestand.oud > bestand.nieuw


Achteraf gezien had ik het eigenlijk moeten weten.... :X
Maar op deze manier hoor je toch een volledige regel te wijzigen.

Thanks voor de info en het meedenken.

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 07:44
teigetjuh schreef op woensdag 03 december 2008 @ 07:41:
Ik heb het uit geprobeerd. Met enkel de punt als wildcard wordt alleen het eerste teken gewijzigd.
Maar de opmerking heeft me wel aan het denken gezet en ik ben tot de volgende werkende oplossing gekomen:
code:
1
sed -e '13s/^.*$/nieuwestring/' Bestand.oud > bestand.nieuw


Achteraf gezien had ik het eigenlijk moeten weten.... :X
Maar op deze manier hoor je toch een volledige regel te wijzigen.
Wat Blaataaps schreef klopt precies, ik denk dat je zijn opmerking niet goed gelezen hebt:
Wildcard "." (dus alleen een punt) betekent: een (1) willekeurig karakter
Wildcard "*" (dus een sterretje) betekent: vorige element nul of meer keer herhaald
Wildcard-combi ".*" betekent dus: 1 willekeurig karakter, nul of meer achter elkaar. Ofwel, een string met random karakters van willekeurige lengte. sed doet default een zo groot mogelijke match ('greedy matching'), dus als je ".*" gebruikt match sed in principe de hele regel.

Als ik jouw opmerking lees, heb je n.a.v. de post van blaataaps geprobeert om met alleen een punt te matchen - je krijgt dan inderdaad dat 'ie alleen het eerste karakter vervangt.

Even samenvatten:
code:
1
sed -e '13s/*/nieuwetext/g' bestand.oud > bestand.nieuw
... jouw originele poging, is gewoon fout omdat er voor '*' niet gespecificeerd wordt wat er nul of meer keer herhaald moet worden.

code:
1
sed -e '13s/./nieuwetext/g' bestand.oud > bestand.nieuw
... waarschijnlijk jouw interpretatie van Blaataaps oplossing, doet het niet: de '.' waarmee gematcht wordt zorgt ervoor dat het eerste karakter op regel 13 vervangen wordt (de '.' match precies 1 willekeurig karakter).

code:
1
sed -e '13s/^.*$/nieuwetext/g' bestand.oud > bestand.nieuw
... jouw oplossing, is goed. "^' match het begin van een regel, '$' het eind van de regel en daartussen moeten nul of meerdere willekeurige karakters.

code:
1
sed -e '13s/.*/nieuwetext/g' bestand.oud > bestand.nieuw
... Blaataaps suggestie, net zo goed maar minder typewerk als jouw oplossing.