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: jak pouzit $promenne v prikaze sed  (Přečteno 6246 krát)

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
jak pouzit $promenne v prikaze sed
« kdy: 20 Února 2009, 14:33:24 »
Ahoj, potrebuju v bash skriptu vymazat nejaky radky z cronu pomoci prikazu sed. To, co se ma mazat mam ulozene v promenne a potiz je v tom, ze ten retezec obsahuje nejen lomitka, ale i hvezdicky, lomitka, tecky a dalsi znaky, ktery sed pouziva jako ridici a v cronu se hojne vyskytujou.

Priklad:

naplnim si $promennou

$promenna=`echo "$minuta $hodina $den $mesic * $cesta/$mujsckript $parametr1`

takze $promenna obsahuje treba toto:
05 12 16 02 * /home/user/test/test.sh 14953

a v cron souboru mam toto:
# blabla
# blabla
05 12 16 02 * /home/user/test/test.sh 14953 50
00 11 19 02 * /home/user/test/test.sh 29845 43
.
.

Zajima nas teda radek, ktery obsahuje 14953, ale to cislo se bohuzel muze v cronu opakovat vickrat jako parametr jineho skriptu nebo v jiny cas, proto nemuzu jednoduse hledat jen radky s tim jednim cislem, ale presne i s tim prikazem a casem. Druhy parametr skriptu test.sh (v nasem pripade 50) muze byt libolne cislo, takze proto je jeste v sed prikazu za ${promenna} ta .*

sed "/${promenna}.*/d" ./muj.cron > ./tmpf
rm -f ./muj.cron
mv ./tmpf ./muj.cron
crontab ./muj.cron

Vyse uvedeny sed samozrejme nefunguje, nejspis proto, ze nema oescapovano. Poradte mi prosim, jak mam tu $promennou (resp retezec v ni) oescapovat tak, aby mi to fungovalo. Zkousel jsem ruzne tipy, co sem nasel na netu, ale tim, ze mam v promenne i tu hvezdicku, tak mi to nepomuze misto / pouzit #, krom toho jsem zjistil, ze to u delete prikazu stejne nejde.

Predem dekuji.
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

8472

  • Aktivní člen
  • *
  • Příspěvků: 460
  • Zivot je ako rebrik do kurina, kratky a osraty ...
Re: jak pouzit $promenne v prikaze sed
« Odpověď #1 kdy: 20 Února 2009, 14:53:21 »
ak chces pouzit cez SED (alebo aj ine) takyto nejaky znak , napr. hviezdicka a pod., pred kazde musis vlozit opacne lomitko \
cize napr. * spravis cez \* a pod.
Logic clearly dictates that the needs of the many outweigh the needs of the few.

nettezzaumana

  • Host
Re: jak pouzit $promenne v prikaze sed
« Odpověď #2 kdy: 20 Února 2009, 15:04:10 »
`man sed` .. koukni na volbu '-i'

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
Re: jak pouzit $promenne v prikaze sed
« Odpověď #3 kdy: 20 Února 2009, 15:09:03 »
ak chces pouzit cez SED (alebo aj ine) takyto nejaky znak , napr. hviezdicka a pod., pred kazde musis vlozit opacne lomitko \
cize napr. * spravis cez \* a pod.
Vsak jo, a to je predmetem mojeho dotazu, jak to prave mam udelat ;D
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
Re: jak pouzit $promenne v prikaze sed
« Odpověď #4 kdy: 20 Února 2009, 15:13:58 »
`man sed` .. koukni na volbu '-i'
Tak jsem myslel, ze budes moje spasa, a zase skoro, -i vypada opravdu slibne. Ted jeste nekde vyguglit kloudnej ikzampl, protoze z manu chapu, k cemu to asi je, ale jak to s tim udelat mi uz jasne neni  ::)
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: jak pouzit $promenne v prikaze sed
« Odpověď #5 kdy: 20 Února 2009, 16:08:41 »
ntz ti radil s necim jinym, ta volba "-i" je tzv. okamzita editace, cili tu upravu provede nad tim souborem a pote jej ulozi (nemusis to tak presmerovavat jinam a pak editovat)

ja bych to naopak udelal grepem. ten totiz regularni vyrazy nepouziva (pokud mu to nereknes), takze to filtrovani neni problem, proste vypises radky, kde ten vyraz neni (volba -v).

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
Re: jak pouzit $promenne v prikaze sed
« Odpověď #6 kdy: 20 Února 2009, 17:07:52 »
ntz ti radil s necim jinym, ta volba "-i" je tzv. okamzita editace, cili tu upravu provede nad tim souborem a pote jej ulozi (nemusis to tak presmerovavat jinam a pak editovat)

ja bych to naopak udelal grepem. ten totiz regularni vyrazy nepouziva (pokud mu to nereknes), takze to filtrovani neni problem, proste vypises radky, kde ten vyraz neni (volba -v).
No vida, a je to :) Diky moc. Ja jak videl "suffix", tak sem myslel, ze mam vyhrano a jak sem guglil, tak mi to vubec nedavalo smysl :) Uz vim proc ;) Nj, mel jsem si ten man lip precist, uz vim, rpoc se o tom vic nerozepsali, kdyz "edit files in place" je nad slunce jasny... :)

Cili mam vyreseny problem, ale ne zodpovezenou otazku ;) Odpoved by me .stejna zajmala :) Tj jak oescapuju retezec v bashi, abych ho moh pak dat sed ovi.
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

8472

  • Aktivní člen
  • *
  • Příspěvků: 460
  • Zivot je ako rebrik do kurina, kratky a osraty ...
Re: jak pouzit $promenne v prikaze sed
« Odpověď #7 kdy: 20 Února 2009, 18:00:40 »
ak chces pouzit cez SED (alebo aj ine) takyto nejaky znak , napr. hviezdicka a pod., pred kazde musis vlozit opacne lomitko \
cize napr. * spravis cez \* a pod.
Vsak jo, a to je predmetem mojeho dotazu, jak to prave mam udelat ;D

ved som to napisal. kde potrebujes pouzit nejaky znak, napr. * $ # @ atd... , tak pred kazdy znak das opacne lomitko \
teda z toho tvojho sed-u:
Kód: [Vybrat]
sed "/\${promenna}.*/d" ./muj.cron > ./tmpfprip. tu mas kopu prikladov (dokonca v tvojej rodnej reci, co viacej si mozes zelat  ;D):
http://sed.sourceforge.net/sed1line_cz.html
Logic clearly dictates that the needs of the many outweigh the needs of the few.

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
Re: jak pouzit $promenne v prikaze sed
« Odpověď #8 kdy: 20 Února 2009, 19:01:43 »
ved som to napisal. kde potrebujes pouzit nejaky znak, napr. * $ # @ atd... , tak pred kazdy znak das opacne lomitko \
teda z toho tvojho sed-u:
Kód: [Vybrat]
sed "/\${promenna}.*/d" ./muj.cron > ./tmpfprip. tu mas kopu prikladov (dokonca v tvojej rodnej reci, co viacej si mozes zelat  ;D):
http://sed.sourceforge.net/sed1line_cz.html

Je videt, ze si nerozumime. Ja potrebuju oescapovat to, co mam v tom retezci, nikoliv nazev te promenne. Kdyz se pouzijou dvojite uvozovky, tak se to interpretuje spravne i bez oescapovani. Jenze celou dobu tu resime obsah te promenne, ne promennou. Prave, ze kdyz to oescapuju tak jak mi radis, tak to *nebude* fungovat, protoze bash nebude predpokladat nazev promenne, ale dolar znak. To je fakt rada nad zlato od tebe, covece, ale dekuju aspon za snahu ;)

Takze znovu a doufam naposledy, mam promennou, ktera *obsahuje* retezec plnej jinak ridicich znaku, napr "hello world * $ . /// + ? bla bla". Chci aby mi sed vymazal vsechny radky, ktery tohlento obsahujou. Jenze tenhle retezec jsem treba nacet nekde ze souboru, takze ho *nemuzu* oescapovat rucne, tim ze si tam proste dopisu zpetny lomitka, potrebuju to vyresit programove, aby mi tam ta lomitka doplnil nejakej prikaz :)

p.s. ten odkaz je dobrej, na to jsem pri gugleni uz narazil, akorat to bylo anglicky, ale beru vsecko, anglictinu, nemcinu, rustinu, i slovenstinu ;) Presto to muj problem neresilo, tak jsem se zeptal tady...
« Poslední změna: 20 Února 2009, 19:08:56 od JohnDoe »
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

8472

  • Aktivní člen
  • *
  • Příspěvků: 460
  • Zivot je ako rebrik do kurina, kratky a osraty ...
Re: jak pouzit $promenne v prikaze sed
« Odpověď #9 kdy: 20 Února 2009, 19:31:48 »
aha, no mas recht ze sme si nwerozumeli zrejme.
tak v tom pripade ani na to neist cez sed, ale skor neguj grep.
teda napr.
Kód: [Vybrat]
cat SUBOR | grep -v $premenna >NOVY_SUBOR alebo pod.moze byt?

EDIT:
resp., aj bez cat,
Kód: [Vybrat]
grep -v $premenna SUBOR >NOVY_SUBOR alebo pod.
Logic clearly dictates that the needs of the many outweigh the needs of the few.

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
Re: jak pouzit $promenne v prikaze sed
« Odpověď #10 kdy: 20 Února 2009, 19:48:39 »
Ano, to uz mi poradil Karel, grep je bezva, pres samotny sedovani jsem na nej uplne zapomel :)

Jenze co kdyz na to ale chci ist cez ten sed? ;) A o to mi jde ted :) Nerad resim problemy tak, ze je obejdu, i kdyz je to obvykle jednodussi. Musi to jit, sed umi lecos, a vsadim se, ze se mi to escapovani muze hodit pozdejs. V php nebo perlu to je snadne, ale ja tyhle high level veci na woknech nechci, protoze ty skripty pobezej i na cygwinu.
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: jak pouzit $promenne v prikaze sed
« Odpověď #11 kdy: 20 Února 2009, 20:26:10 »
Kód: [Vybrat]
karel@stazka:~$ promenna='05 12 16 02 * /home/user/test/test.sh 14953'
karel@stazka:~$ escprom=$(echo "$promenna" | sed 's!\([]\*\$\/&[]\)!\\\1!g')
karel@stazka:~$ echo "$escprom"
05 12 16 02 \* \/home\/user\/test\/test.sh 14953
karel@stazka:~$ echo '05 12 16 02 * /home/user/test/test.sh 14953 50' | sed "s/$escprom/nahrazeny_text/"
nahrazeny_text 50
zdroj

8472

  • Aktivní člen
  • *
  • Příspěvků: 460
  • Zivot je ako rebrik do kurina, kratky a osraty ...
Re: jak pouzit $promenne v prikaze sed
« Odpověď #12 kdy: 20 Února 2009, 20:26:29 »
tak, urcite sa to da aj cez sed, ale by som povedal ze to  bude namahavejsia cesta.
pretoze ak chces aby ti automaticky pred kazdy uz spomenuty znak typu * # $ a pod pchalo \ , tak to by tam asi muselo byt nejake IF , THEN, ELIF/ELSE, FI , cez ktore by sa v podstate analyzoval cely retazec povodnej premennej a na zaklade toho by podoplnal potrebne lomitko \ kam treba. - teda aspon ja by som na to isiel asi takto nejako.
kazdopadne myslim, ze kym by sa taky mechanizmus dostatocne vyladil, tak zabije clovek nejaky cas. a naco ak existuje aj jednoduchsie riesenie s grep-om?
Logic clearly dictates that the needs of the many outweigh the needs of the few.

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
Re: jak pouzit $promenne v prikaze sed
« Odpověď #13 kdy: 20 Února 2009, 21:52:51 »
No ja si prave myslim, ze to bude mnohem trivialnejsi ;) Nebo aspon doufam. V zivote bych nerek, ze napr. sed zvladne vymazat duplicitni radky, taky by si jeden rekl, ze se to bude muset programove porovnavat jeden radek po druhym nebo pouzit nejakej jinej prikaz...

To, ze nevime jak na to, neznamena, ze to nutne musi byt slozite. Jasne, problem mam vyreseny, tak se netreba v tom stourat. Jenze kdybych nechtel resit problemy jak se co dela, tak sem na woknech a na na linuxu :)
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: jak pouzit $promenne v prikaze sed
« Odpověď #14 kdy: 21 Února 2009, 06:55:01 »
Odpoved #11 nestacila?

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
Re: jak pouzit $promenne v prikaze sed
« Odpověď #15 kdy: 22 Února 2009, 00:21:21 »
Odpoved #11 nestacila?
No vidis, ja jsem to uplne prehlidnul :) Vypada to naramne slozite, bude trvat nejmin hodinu, nez to pochopim :) Moc dekuju, hned to letim vyzkouset ;D

Jeste jedna vec, zjistil jsem, ze ten grep -v nemuzu pouzit, protoze neumi hledat retezce, ve kterych jsou lomitka, a nepomohlo mi je ani oescapovat.
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: jak pouzit $promenne v prikaze sed
« Odpověď #16 kdy: 22 Února 2009, 09:57:37 »
Jeste jedna vec, zjistil jsem, ze ten grep -v nemuzu pouzit, protoze neumi hledat retezce, ve kterych jsou lomitka, a nepomohlo mi je ani oescapovat.
tak jsem to zkusil, nejde o lomitka, ale z nejakyho duvodu tam vadi ta hvezdicka a je treba ji oescapovat.
Kód: [Vybrat]
karel@stazka:~$ cat test.txt
05 12 16 02 * /home/user/test/test.sh 14953 50
00 11 19 02 * /home/user/test/test.sh 29845 43
karel@stazka:~$ grep '05 12 16 02 * /home/user/test/test.sh' test.txt
karel@stazka:~$ grep '05 12 16 02 \* /home/user/test/test.sh' test.txt
05 12 16 02 * /home/user/test/test.sh 14953 50
je to divny, rozhodne by nemela byt interpretovana shellem, no nevim nevim.

JohnDoe

  • Aktivní člen
  • *
  • Příspěvků: 168
Re: jak pouzit $promenne v prikaze sed
« Odpověď #17 kdy: 24 Února 2009, 20:53:42 »
No jo, fakt :) Ses borec ;) Myslis, ze tu hvezdicku interpretuje shell? Nebo ze by grep precejen na nejaky specialni znaky v retezci hledel? :) Po tech mnoha neuspesich me ani nenapadlo zkusit tu zatracenou hvezdicku oescapovat ;) Moc dekuju za pomoc!
« Poslední změna: 24 Února 2009, 21:03:16 od JohnDoe »
Omlouvam se za psani bez hacku a carek, ale s nimi bych to psal jeste zitra :(

nettezzaumana

  • Host
Re: jak pouzit $promenne v prikaze sed
« Odpověď #18 kdy: 24 Února 2009, 23:39:30 »
man grep // viz. sekce Character Classes and Bracket Expressions ..

## JFYI .. grep by default samozrejme bere "basic REs" ..

grep '^[a]\{2\}' <(echo -e 'a\naa\nb\nc')
aa

 

Provoz zaštiťuje spolek OpenAlt.