Nahrazení řetězce pomocí reg. výrazu

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #15 kdy: 23. 03. 2010, 11:45:48 »
Jinak ale, ještě bych to potřeboval přejmenovat a uložit do souboru a toto mi nefunguje:
pattern=${pattern//\//\\\/}

Kód: [Vybrat]
sed -i -e "s%$pattern%$new_line%" /etc/fstab
a dostávám hlášku:
sed: -e výraz č. 1, znak 2: neukončený příkaz „s“
zkoušel jsem to i s normálními lomítky / a taky bez -i -e ale bez výsledku. Dělal jsem to podle "info sed" tak nevím proč to nejde.


deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #16 kdy: 24. 03. 2010, 05:36:09 »
Citace
Kód: [Vybrat]
sed -i -e "s%$pattern%$new_line%" /etc/fstabsed: -e výraz č. 1, znak 2: neukončený příkaz „s“

Problem je s premennou pattern. Podla kodu o prispevok vyssie, tak obsahuje odriadkovanie na zaciatku. Skus
Kód: [Vybrat]
echo "%s$pattern%"

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #17 kdy: 24. 03. 2010, 05:37:24 »
oprava:

Kód: [Vybrat]
echo "s%$pattern%"

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #18 kdy: 24. 03. 2010, 05:41:18 »
Citace
Kód: [Vybrat]
awk  '{print $1"[:space:]*"$1"[:space:]*"$3"[:space:]*"$4"[:space:]*"$5"[:space:]*"$6}'

Nemali by tam byt hviezdicky, ale \+ (aspon jedna medzera)

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #19 kdy: 24. 03. 2010, 08:17:50 »
Dobre. To co tedy v podstate mam je neco take:

Kód: [Vybrat]
pattern="tento radek je zprava pro uzivatele.... bla bla.
tento radek je oddelovac
tento radek je predloha - to co se ma vyfiltrovat
"

Hodnota promenne pattern se vygenerovala pomoci grep a cyklu while.
A jak mam ted teda postupovat? Mam pro predlohu nastavit rezim multiline? Ja znam regularni vyrazy jen z PHP a tam by to bylo myslim \M. Nebo raději pouzit označeni konce a začátku řádku? Tak aby to hledalo po řádcích. To se mi zdá rozumnější. Ale nevím jak to udělat. Nemám dost jasno jaké jsou rozdíly mezi reg.exp. v awk, sed a parameter subsitution?

Ve svem scriptu jsem si chyby s hvezdickou uz vsiml a opravil na+. Nicméně do předloh se musí dávat vždy zpětné lomítko před kvantifikátor?

Z tohoto
Kód: [Vybrat]
hlaska=${s%pattern%\nTOTO_JE_JEN_ODDELOVAC_KTERY_ODDELI_HLASKU_OD_PREDLOHY_SAMOTNE*} # smazat od konce (od posledního výskytu)
pattern=${s#pattern#*\nTOTO_JE_JEN_ODDELOVAC_KTERY_ODDELI_HLASKU_OD_PREDLOHY_SAMOTNE} # smazat od začátku (od prvního výskytu)
výskytu)
Potrebuju vymazat vse od \nTOTO_JE_JEN_ODDELOVAC_KTERY_ODDELI_HLASKU_OD_PREDLOHY_SAMOTNE az do konce

Současná hláška:
sed: -e výraz č. 1, znak 0: žádný předcházející regulární výraz
sed: -e výraz č. 1, znak 0: žádný předcházející regulární výraz
« Poslední změna: 24. 03. 2010, 09:00:47 od webhope webhope »


deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #20 kdy: 25. 03. 2010, 09:26:16 »
Kód: [Vybrat]
pattern="tento radek je zprava pro uzivatele.... bla bla.
tento radek je oddelovac
tento radek je predloha - to co se ma vyfiltrovat
"

Tak vysledne riadky by som spracoval cez sed (ten oddelovac tam nemusi byt ak je to na viacerych riadkoch:
Kód: [Vybrat]
pattern="tento radek je zprava pro uzivatele.... bla bla.
tento radek je oddelovac
tento radek je predloha - to co se ma vyfiltrovat
"
sprava=$(echo "$pattern" | sed -n '1p') #vypis prveho riadku
predloha=$(echo "$pattern" | sed -n '3p')

Je to v troch riadkoch, lebo kazde echo vypise koniec riadku - bolo by v jednom riadku, ak by sa spustalo echo -n

Co sa tyka znaku + zavisi od pouzitych reg. vyrazov (BRE, ERE, PERL regex - vid wikipedia)... + v grepe (BRE) oznacuje znak plus a \+ pocet (aspon jeden krat). V egrep (ERE) je to presne naopak.

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #21 kdy: 25. 03. 2010, 10:50:54 »
Díky za odpověď. Jak budu na linuxu, tak to vyzkouším.

Edit
Našel jsem taky jedny pěkné stránky (hezky zformátovaný text):
http://www.zytrax.com/tech/web/regex.htm

Ale nenašel jsem tam bash. Bash je ERE nebo BRE? Ptám se kvůli parameter substitution.
« Poslední změna: 25. 03. 2010, 18:39:50 od webhope webhope »

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #22 kdy: 25. 03. 2010, 18:56:08 »
Stále mi nejede ta předloha v sedu:

Předloha:
UUID=2090ACC103B52D41[:space:]\+\/media\/win_c[:space:]\+ntfs-3g[:space:]\+defaults,umask=000[:space:]\+0[:space:]\+0   

fstab:
# Entry for /dev/sda1 :                                                       
UUID=2090ACC103B52D41 /media/win_c ntfs-3g defaults,umask=000 0 0

Sed:
Kód: [Vybrat]
sed -e "s%$pattern%$new_line%" /etc/fstab
pattern=${pattern//\//\\\/}
sed -e "s%$pattern%$new_line%" /etc/fstab

Výsledek žádný, soubor nezměněn

Nahrazovací řetězec je:
UUID=E0CC96C0CC969080 /media/pokus ntfs-3g defaults,umask=000 0 0

Ale jsou tam mezery. Není to problém?
« Poslední změna: 25. 03. 2010, 19:01:29 od webhope webhope »

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #23 kdy: 25. 03. 2010, 20:59:52 »
Citace
UUID=2090ACC103B52D41[:space:]\+ ...
[:space:] apod. sa mozu pouzivat iba v zozname znakov [], teda ak chcem len medzeru/biely znak, tak [[:space:]].

Prikazom sed sa subor nemeni, len by to malo vypisat zmenene na obrazovku. Pre zmenu treba pouzit prepinac -i.

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #24 kdy: 26. 03. 2010, 08:00:36 »
Aha, já myslel, že  -i je insensitive.
Skvělé, povedlo se to :-) Tak dík za pomoc. Myslím, že teď už těm reg.exp. víc rozumím.
« Poslední změna: 26. 03. 2010, 08:27:44 od webhope webhope »

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #25 kdy: 26. 03. 2010, 08:35:58 »
Citace
Aha, já myslel, že  -i je insensitive.

Ono to zavisi od prikazu:
grep -i ... ignore case
sed -i ... inplace editing

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #26 kdy: 26. 03. 2010, 13:06:20 »
Nevíš proč mi nejde toto:

Kód: [Vybrat]
for file in ${seznam[@]}; do
  i+=1;
  adresare[$i]=$( mount | grep $cesta/$file )
done;

Výstup od mount je:
/dev/sda1 on /mnt/i type fuseblk (rw,allow_other,blksize=4096)

No a hlásí mi to tuto chybu:
adresare[$i]: chybný podskript pole

Když spustím
mount | grep $cesta/$file
samostatně tak to funguje
« Poslední změna: 26. 03. 2010, 13:08:51 od webhope webhope »

deadmail

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #27 kdy: 26. 03. 2010, 21:04:23 »
Citace
i+=1;
Mne to generuje 1, 11, 111, ...

Asi to malo byt:
Kód: [Vybrat]
i=$((i+1))

NN

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #28 kdy: 26. 03. 2010, 22:09:49 »
Spise ted:

i++

NN

webhope

Re: Nahrazení řetězce pomocí reg. výrazu
« Odpověď #29 kdy: 27. 03. 2010, 00:50:19 »
Funguje :-) - Podle Deadmail

Podle NN píše
./set_fstab.sh: řádek 32: i++: příkaz nenalezen
/dev/sda1 on /mnt/i type fuseblk (rw,allow_other,blksize=4096)
./set_fstab.sh: řádek 33: adresare_prip[$i]: chybný podskript pole