Portál AbcLinuxu, 20. května 2024 09:47


Dotaz: sed - substituce promenou nefunguje

4.10.2009 03:44 anon123 | skóre: 35 | blog: ganomi
sed - substituce promenou nefunguje
Přečteno: 300×
Odpovědět | Admin

Ahoj.

Pisu malej skriptik a nefunguje mi substituce s promenou u sed.

changeName(){
SPEED="$(echo ${LINEARRAY[8]} | sed -e 's/<[^>]*>//g' speedline.txt | sed -e 's/Speed://g')"
TEMP=$(echo ${LINEARRAY[1]})  | sed  "s/-[0-9]*/'SPEED'/"
echo -e "$TEMP"
}

Vyzkousel jsem:

TEMP=$(echo ${LINEARRAY[1]})  | sed  "s/-[0-9]*/'"SPEED"'/"
TEMP=$(echo ${LINEARRAY[1]})  | sed  's/-[0-9]*/'SPEED'/'
TEMP=$(echo ${LINEARRAY[1]})  | sed  "s/-[0-9]*/${SPEED}/"

Hazi mi to error:

sed: -e expression #1, char 36: unknown option to `s'

Zajimave je, ze na konzoli to funguje:

echo -e "   <name>-265</name>" | sed -e 's/-[0-9]*/'$LOGNAME'/'

 

Muzete nekdo poradit?
Dik

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.10.2009 04:10 anon123 | skóre: 35 | blog: ganomi
Rozbalit Rozbalit vše Re: sed - substituce promenou nefunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin

Uprava:
v mem prispevku jsem zapomnel na "$" pred SPEED.

Takze spravne:

TEMP=$(echo ${LINEARRAY[1]})  | sed  "s/-[0-9]*/'"$SPEED"'/"
TEMP=$(echo ${LINEARRAY[1]})  | sed  's/-[0-9]*/'$SPEED'/'
TEMP=$(echo ${LINEARRAY[1]})  | sed  "s/-[0-9]*/${SPEED}/"

Toto hazi error, kdyz to mam ve scriptu.


4.10.2009 07:45 l4m4
Rozbalit Rozbalit vše Re: sed - substituce promenou nefunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Takovou věc bych napsal v něčem, co umí nahrazování regulárních výrazů samo (pytho, ruby, perl, ...) a nespouštěl tisíckrát sed, který je navíc řádkově orientovaný, takže je problém s elementy přes víc řádků
< tag a="b"
          c="d">
a tohle
sed -e 's/<[^>]*>//g' speedline.txt | sed -e 's/Speed://g'
se taky normálně napíše
sed -e 's/<[^>]*>//g' -e 's/Speed://g' speedline.txt
nebo s GNU sedem
sed 's/<[^>]*>//g;s/Speed://g' speedline.txt
K původnímu dotazu: proměnná $LOGNAME zřejmě obsahuje znaky, které jsou v daném kontextu pro sed speciální (řekl bych, že lomítko). Je možno hodnotu proměnné oescapovat (např. dalším sedem)
LOGNAME=$(sed 's/[\/...]/\\\0/g' <<<"$LOGNAME")
ale je to celé šílený postup, který se používá nanejvýš v configure, protože to musí být ultrapotrabilní a nepoužívat nic použitelného. Správný postup je použít pro řešení problému nástroj, který je k tomu vhodný.
4.10.2009 11:10 anon123 | skóre: 35 | blog: ganomi
Rozbalit Rozbalit vše Re: sed - substituce promenou nefunguje

Chapu co tim chces rici, ale nebudu se 30 dni ucit neco, co pouziji jenom jednou. Navic to potrebuji co nejdrive, volim tedy nastroj, kterym se to da zvladnout co nejdriv.

Jinak diky za ty upravy. To samozrejme implementuji.

Splacal jsem to takto:

changeName(){

SPEED="$(echo ${LINEARRAY[8]} | sed -e 's/<[^>]*>//g' | sed -e 's/.*Speed://g')"

TEMP1=$(echo -e "${LINEARRAY[1]}" | sed -e 's/-[0-9]*<\/name>//')
TEMP2=$(echo -e "${LINEARRAY[1]}" | sed -e 's/.*<name>-[0-9]*//')

TEMP=$TEMP1$SPEED$TEMP2
LINEARRAY[1]=$TEMP
}
4.10.2009 19:10 pozortucnak | skóre: 21 | blog: vecny_windowsar
Rozbalit Rozbalit vše Re: sed - substituce promenou nefunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Perl je na tohle v pohode... nic se učit nemusíš
echo aaa | perl -pe "s/aaa/$USER/g"
Jsem mimořádně obtížný případ
5.10.2009 01:00 l4m4
Rozbalit Rozbalit vše Re: sed - substituce promenou nefunguje
Toto samozřejmě trpí identickým problémem, pokud je $USER proměnná shellu, kterou cpeš do zdrojáku perlu. Jiná situace by byla s perlí proměnnou $USER, ale to bys to, jak jsem říkal, musel psát v perlu (nebo raději něčem čitelnějším) celé.
5.10.2009 11:38 saslik
Rozbalit Rozbalit vše Re: sed - substituce promenou nefunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin

Tipuju ze problem je v obsahu promenne SPEED. Prikaz pro sed se trextove sestavi a pokud je tam vyznamny znak, napriklad lomitko v "km/hour", tak to bude chybne. Pro ladeni takovych skriptu je dobre vzdy vypsat co se bude spoustet a pak to spustit, pak uvidis jestli se to sestavilo dobre nebo ne.

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.