Portál AbcLinuxu, 28. července 2025 05:20


Dotaz: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}

25.4.2017 18:26 perl
sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Přečteno: 389×
Odpovědět | Admin
Nemohu prijit nato jak donutit sed aby udelal nahrazeni textu $VAR$ za obsah promenne VARIABLE.
VARIABLE=aaa
sed -e "s/\$VAR\$\/${VARIABLE}/g" /tmp/text.txt
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.4.2017 19:48 Lyco | skóre: 14 | blog: Lyco
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Odpovědět | | Sbalit | Link | Blokovat | Admin
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
Příspěvek se rázem stává až o 37,5 % pravdivější, je-li pod ním napsáno reálné jméno.
25.4.2017 22:22 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Technická poznánmka: na tohle není potřeba, aby byla ta proměnná exportovaná, protože expanzi proměnné provede už shell ještě před tím, než předá parametr příkazu sed.
25.4.2017 23:46 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}

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.

25.4.2017 20:19 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Odpovědět | | Sbalit | Link | Blokovat | Admin
Místo uvozovek je nutné ve vzorku použít apostrofy:
VARIABLE=aaa
sed -e 's/\$VAR\$\'"/${VARIABLE}/g" /tmp/text.txt
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
25.4.2017 21:24 Ondřej Kubečka | skóre: 29 | blog: datlovo | Ulm
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Nebo vyescapovat i to zpětně lomítko:

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
25.4.2017 22:29 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}

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. :-)

25.4.2017 22:33 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Rozbalovat ve skriptu do regulárního výrazu jakýkoli řetězec od uživatele je vždy o držku (a programátorovi přes držku).
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
25.4.2017 22:35 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Tady se expanduje do replacement stringu, ne do regulárního výrazu.
25.4.2017 23:42 RM
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
To platí jen v shellu, protože je to makro jazyk. V Perlu je to normální věc a programátoři se za to netlučou.
26.4.2017 15:28 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Předpokládal jsem, že se bavíme o shellu. Perl neřeším.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
25.4.2017 23:33 RM
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
To už se vám tam nevejde. Já bych to udělal POSIXově a oddělil si to. Tady už to chce velkou opatrnost:
replace="bar\1&\nfoo//"
unsedvar="$(printf '%s' "$replace" | sed 's|\\|\\\\|g ; s|/|\\/|g ; s|&|\\&|g')"
sed 's/\$VAR\$/'"$unsedvar/g" file.txt
26.4.2017 00:00 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Odpovědět | | Sbalit | Link | Blokovat | Admin

Já bych netrval na sedu. Nacpat obsah proměnné do příkazu sedu 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///>>>
26.4.2017 00:02 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}

Tedy, tomu awk se samozřejmě dá ten vstupní soubor, buď jako argument nebo na standardní vstup.

26.4.2017 00:13 RM
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
sedu s sebou vždycky nese riziko, že s v ní budou znaky

Nenese, sed má jen ty tři & \ a použitý oddělovač, jinak je to bezpečné, co já vím. U toho awku vám bude stejně vadit minimálně &, což je speciální znak substituce awku.
26.4.2017 16:00 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}

No jo, bude se tam muset dát ${VARIABLE//&/\\&} (přiřadit do jiné proměnné prostředí nebo tak).

26.4.2017 16:04 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}

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ě.

Josef Kufner avatar 26.4.2017 16:08 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: sed nahrazeni textu $VAR$ za obsah ${VARIABLE}
Odpovědět | | Sbalit | Link | Blokovat | Admin
A co když $VARIABLE bude obsahovat lomítko?

Pokaždé, když takovýto dotaz vidím, říkám si, co to zas kdo dělá za ptákovinu?

První věc, co je potřeba udělat, když narazíš na takovýto komplikovanější problém, je zahodit shell a napsat to v něčem rozumném – třeba v Pythonu, PHP, Perlu,… je to jedno. Obvykle si tím člověk ušetří kopec starostí s krajními případy a navíc bude mít k dispozici pořádné datové struktury.

Shell je dobrý na slepení pár příkazů. Na cokoliv komplikovanějšího je to ztráta času.
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.