Portál AbcLinuxu, 5. května 2025 13:07
{key}gain_mode0{/key}
{value}0{/value}
{value}False{/value}
sed 's/\(gain_mode[0-9]<\/key>\)/\1False/'
ale nemůžu se dostat na další řádek ať dělám co dělám.Řešení dotazu:
tady to fórum je nepovolujeJe to HTML. Takže < a >. Zeptej se oblíbeného vyhledávač na sed match multiple lines a proklikej si prvních pár výsledků.
sed '/gain_mode[0-9]<\/key>/,/param/s/0/False/g;s/modeFalse/mode0/'
sed -i "s/bla/ble/" *.txt
sed -i '/gain_mode[0-9]/,/param/s/0/False/g;s/modeFalse/mode0/' *.grc
find . -type f -name '*.grc' -exec sed -i '/gain_mode[0-9]/,/param/s/0/False/g;s/modeFalse/mode0/' {} \;
Mimochodem jedná se o aktualizaci GNURadio z verze 3.7.2 na verzi 3.7.3, kdy mi všechny staré skripty přestaly naráz fungovat a tahle "oprava" to vyřešila. Ručně to nešlo.
tady to fórum je nepovoluje
>>> Opravdu? <<<
Proč zrovna sed
? Podle mě je na to lepší awk
. Výstřel od boku (zcela jistě s chybami):
#!/usr/bin/awk -f BEGIN { state = 0 } state { print "<value>False</value>" state = 0 next } /<key>gain_mode[0-9]<\/key>/ { state = 1 } { print $0 }
První možnost je nazvat ten skript třeba convertor
a pak spustit ./convertor < vstup > výstup
. Druhá možnost je dát celý zdroják awk
jako parametr, tj.
awk 'BEGIN { state = 0 } state { print "<value>False</value>"; state = 0; next } /<key>gain_mode[0-9]<\/key>/ { state = 1 } { print $0 }' < vstup > výstup
Kdyby náhodou mohl existovat <key> bez <value> nebo pokud je potřeba měnit hodnotu jen tehdy, byla-li původně 0, stačí pozměnit podmínku u druhé klauzule, tj. místo state { … } tam dát například state && /<value>0<\/value>/ { … }
To už záleží na tom, jaké je přesně zadání problému.
Vše výše zmíněné platí v případě, že <key>
a <value>
jsou vždy samostatně na jednom řádku. Jinak by bylo potřeba doplnit do regulárních výrazů podle potřeby ^
a $
, případně místo nahrazení celé řádky použít funkce sub()
nebo gsub()
v awk
— podle toho, jakým způsobem je třeba celý filtr omezit nebo rozšířit. Příkladem použití sub()
by bylo odstranění next
z druhé klauzule a nahrazení print "<value>False</value>"
nad tím za sub(/<value>0<\/value>/, "<value>False</value>")
. (sub()
v tomto tvaru provede náhradu přímo v proměnné $0
, která obsahuje celý řádek, a poslední klauzule pak (díky odstranění next
) řádek vypíše.)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.