Placená komunitní podpora
Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
mojeID OpenID
Pokročilé vyhledávání  

Novinky:

Přijďte se podívat a oslavit nové vydání Ubuntu 13.04, více informací naleznete zde.

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

Vojtěch Trefný

  • Člen občanského sdružení Ubuntu ČR
  • Zasloužilý Ubunťák
  • Guru
  • *****
  • Karma: +846/-85
  • Pohlaví: Mužské
  • Příspěvků: 9049
  • Don Quijote
    • Zobrazit profil
    • Blog nejen o Ubuntu
[Bash] sed ve for cyklu [vyřešeno]
« kdy: 01 Květen 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ěten 2012, 11:50:11 od Vojtěch Trefný »
IP zaznamenána

jmp

  • Závislák
  • ****
  • Karma: +128/-19
  • Příspěvků: 1578
    • Zobrazit profil
Re:[Bash] sed ve for cyklu
« Odpověď #1 kdy: 01 Květen 2012, 11:06:24 »

IP zaznamenána

Vojtěch Trefný

  • Člen občanského sdružení Ubuntu ČR
  • Zasloužilý Ubunťák
  • Guru
  • *****
  • Karma: +846/-85
  • Pohlaví: Mužské
  • Příspěvků: 9049
  • Don Quijote
    • Zobrazit profil
    • Blog nejen o Ubuntu
Re:[Bash] sed ve for cyklu
« Odpověď #2 kdy: 01 Květen 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

  • Závislák
  • ****
  • Karma: +316/-17
  • Pohlaví: Mužské
  • Příspěvků: 1756
    • Zobrazit profil
Re:[Bash] sed ve for cyklu
« Odpověď #3 kdy: 01 Květen 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.
IP zaznamenána
GdH-Notes - tipy, triky, skripty a desktop Ubuntu

Vojtěch Trefný

  • Člen občanského sdružení Ubuntu ČR
  • Zasloužilý Ubunťák
  • Guru
  • *****
  • Karma: +846/-85
  • Pohlaví: Mužské
  • Příspěvků: 9049
  • Don Quijote
    • Zobrazit profil
    • Blog nejen o Ubuntu
Re:[Bash] sed ve for cyklu
« Odpověď #4 kdy: 01 Květen 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

  • Závislák
  • ****
  • Karma: +128/-19
  • Příspěvků: 1578
    • Zobrazit profil
Re:[Bash] sed ve for cyklu
« Odpověď #5 kdy: 01 Květen 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$
IP zaznamenána