Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: [Bash] sed ve for cyklu [vyřešeno]  (Přečteno 1826 krát)

Vojtěch Trefný

  • Příspěvků: 9307
  • Don Quijote
[Bash] sed ve for cyklu [vyřešeno]
« kdy: 01 Května 2012, 10:26:46 »
Potřeboval bych poradit s následujícím problémem:

Mám proměnné search1 až searchN a replace1 až replaceN (obsahující řetězce pro vyhledání a nahrazení v souboru), ale když nacpu sed do for cyklu (abych nemusel jak *censored* vypisovat N-krát stejný příkaz), tak se mi to nějak nechytá.

Kód: [Vybrat]
for i in {1..N}
do
sed -i 's/'"$search$i/$replace$i"'/g' $soubor
done
« Poslední změna: 01 Května 2012, 11:50:11 od Vojtěch Trefný »

jmp

  • Host
Re:[Bash] sed ve for cyklu
« Odpověď #1 kdy: 01 Května 2012, 11:06:24 »

Vojtěch Trefný

  • Příspěvků: 9307
  • Don Quijote
Re:[Bash] sed ve for cyklu
« Odpověď #2 kdy: 01 Května 2012, 11:17:03 »
V těch uvozovkách by to být nemělo, ty tam mám takhle pochybně udělaný proto, že v těch proměnných jsou občas nějaké pochybné znaky, které potřebuju tak, jak jsou. A navíc samotné "sed -i 's/'"$search1/$replace1"'/g' $soubor" funguje správně.

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:[Bash] sed ve for cyklu
« Odpověď #3 kdy: 01 Května 2012, 11:35:42 »
Problém je v expandování těch proměnných, zkus si

>$ s1=aa
>$ i=1
>$ echo $s$1
1

expandují se postupně a tak dostaneš řetězec $s + $i a jelikož je $s nedefinovaný, dostaneš ve výsledku jen $i.

Použij pole.

Vojtěch Trefný

  • Příspěvků: 9307
  • Don Quijote
Re:[Bash] sed ve for cyklu
« Odpověď #4 kdy: 01 Května 2012, 11:47:42 »
GdH: Taky mě nakonec napadlo si to vyzkoušet, ale nakonec mě jmp trochu nakopnul správným směrem a výsledek je prasokód, ale funkční prasokód :)

Kód: [Vybrat]
for i in {1..9}
do
eval pom1=`echo '$search'$i`
eval pom2=`echo '$replace'$i`
sed -i 's/'"`echo $pom1`/`echo $pom2`"'/g' $soubor
done

jmp

  • Host
Re:[Bash] sed ve for cyklu
« Odpověď #5 kdy: 01 Května 2012, 11:48:22 »
Kód: [Vybrat]
jmp@ic-q180:~/tst$ cat tst
#!/bin/bash
srch="AA"
rpl="BB"
for i in {1..5}
do
    echo 's/'"$srch$i/$rpl$i"'/g'
done

Kód: [Vybrat]
jmp@ic-q180:~/tst$

jmp@ic-q180:~/tst$ ./tst
s/AA1/BB1/g
s/AA2/BB2/g
s/AA3/BB3/g
s/AA4/BB4/g
s/AA5/BB5/g
jmp@ic-q180:~/tst$

 

Provoz zaštiťuje spolek OpenAlt.