Portál AbcLinuxu, 28. července 2025 05:20
VARIABLE=aaa sed -e "s/\$VAR\$\/${VARIABLE}/g" /tmp/text.txt
VARIABLE=aaa
vytvoří proměnnou shellu, kterou programy z shellu spuštěné nevidí. Zkus
export VARIABLE=aaa sed -e "s/\$VAR\$\/${VARIABLE}/g" /tmp/text.txt
sed
.
To je nesmysl. Zaprvé, sed žádnou proměnnou nepotřebuje vidět, protože ji expanduje přímo shell do toho argumentu sedu. Zadruhé, i kdyby ji sed viděl ve svém environment poli (3. argument main() atd. atp.), nikdy by ji nepoužil, protože sed prostě a jednoduše nikdy žádné proměnné prostředí neexpanduje, dolar neinterpretuje jako začátek názvu proměnné atd. atp. Není to shell.
VARIABLE=aaa sed -e 's/\$VAR\$\'"/${VARIABLE}/g" /tmp/text.txt
sed -e "s/\\\$VAR\\\$/${VARIABLE}/g" /tmp/text.txt
Což mě vede k druhé poznámce. sed
výrazy, kde se z jakéhokoliv důvodu objevuje jakékoliv lomítko se blbě čtou, když se takže raději třeba:
sed -e "s@\\\$VAR\\\$@${VARIABLE}@g" /tmp/text.txt
resp. předchozí mix uvozovek třeba:
sed -e 's#\$VAR\$#'"${VARIABLE}#g" /tmp/text.txt
Pořád máte problém, pokud hodnota té proměnné bude obsahovat oddělovač. Takže abrakadabra…
sed -re "s/\\\$VAR\\\$/${VARIABLE//\//\\/}/g"
A teď ještě ošetřit věci typu "\1
", "&
", a to už snad bude všechno. :-)
replace="bar\1&\nfoo//" unsedvar="$(printf '%s' "$replace" | sed 's|\\|\\\\|g ; s|/|\\/|g ; s|&|\\&|g')" sed 's/\$VAR\$/'"$unsedvar/g" file.txt
Já bych netrval na sed
u. Nacpat obsah proměnné do příkazu sed
u s sebou vždycky nese riziko, že v ní budou znaky, které sed
zmatou. Připomíná to kdysi populární SQL injection útoky. Co třeba tohle?
export VARIABLE='>>>///ble;ble///<<<' awk '{gsub(/\$VAR\$/, ENVIRON["VARIABLE"]); print $0}'
Tady^^^ může $VARIABLE
obsahovat, co chce. Testovací vstup:
something $VAR$ ble $VAR$$$$VAR$ blabla Karlovy $VAR$y 00$VAR$1 $VAR$$VAR$
Vrací mi to tohle, což by snad i docela šlo:
something <<<///ble;ble///>>> ble <<<///ble;ble///>>>$$<<<///ble;ble///>>> blabla Karlovy <<<///ble;ble///>>>y 00<<<///ble;ble///>>>1 <<<///ble;ble///>>><<<///ble;ble///>>>
Tedy, tomu awk
se samozřejmě dá ten vstupní soubor, buď jako argument nebo na standardní vstup.
No jo, bude se tam muset dát ${VARIABLE//&/\\&}
(přiřadit do jiné proměnné prostředí nebo tak).
Což stále neřeší VARIABLE='\&'
, protože výsledek "\\&"
pochopí awk jinak, než bylo zamýšleno. Takže by se to muselo oescapovat úplně a pořádně.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.