[sed] string escaping

Pagina: 1
Acties:

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter
code:
1
2
3
4
5
6
cat $CERTSTORE/cert/$root/openssl.cnf | sed \
  -e "s/%DEF_C%/$def_c/g" \
  -e "s/%DEF_ST%/$def_st/g" \
  -e "s/%DEF_L%/$def_l/g" \
  -e "s/%DEF_O%/$def_o/g" \
> $CERTSTORE/cert/$root/openssl.cnf

Alle "%DEF_C%"'s in de config worden gewijzigd in de waarde die in $def_c staat. Dit gaat goed totdat ik bijvoorbeeld "C&A" meegeef. Mijn vraag dus: hoe kan ik zorgen dat sed de $def_c string "as is" translate, dus hoe kan ik een compelete string ineens escapen, ipv een enkele char"?

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • wiho
  • Registratie: Februari 2000
  • Laatst online: 09:43

wiho

Certified Nerd

In O'reilly's Sed & Awk boek kan ik niets vinden over het escapen/quoten van complete strings (a la Perls \Q). Maar je kun natuurlijk wel sed gebruiken om eerst alle karakters in je variabele zelf te escapen:
code:
1
echo $def_c | sed "s/\(.\)/\\\\\1/g"

Vervolgens nestel je die in de originele sed expressie:
code:
1
2
3
cat $CERTSTORE/cert/$root/openssl.cnf | sed \
  -e "s/%DEF_C%/`echo $def_c | sed 's/\(.\)/\\\\\1/g'`/g"
  (...)

Niet mooi, niet leesbaar, maar werkt wel. :)

"Pas als het proces gecrashed is, dumpt men de core"


  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter
Het enige wat ik hoef te escapen is de "&" en eventueel de "\d", aangezien dat de twee specials zijn in de tweede string van de sed-subsitute, maar voor hetzelfde geld komen er later hier meer bij, of ben ik er een aantal vergeten. Het is dus makkelijker om het te escapen zoals de \Q...\E bij regexen (wat dus weer wel mag in de eerste string van sed-subsitute).

Wat ik dus nu doe, zijn deze chars escapen voor de sed. Inderdaad niet de mooiste oplossing, maar goed.. het werkt, en regexen/perl/awk/sed zijn al per definitie niet bedoeld voor de leesbaarheid :)

Yo dawg, I heard you like posts so I posted below your post so you can post again.