Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: webhope 12. 04. 2010, 20:01:12
-
Zkouším sestrojit reg. výraz pro grep, ale moc mi to nejde.
Mám např. takovýto kousek kódu:
urpmi --auto FAAC
urpmi --auto lame
urpmi --auto codec
urpmi.addmedia Main ftp://ftp.free.fr/mirrors/ftp.mandriva.com/MandrivaLinux/official/2010.0/i586/media/main/release
urpmi.addmedia --update Main_updates ftp://ftp.free.fr/mirrors/ftp.mandriva.com/MandrivaLinux/official/2010.0/i586/media/main/updates
urpmi.addmedia Contrib ftp://ftp.free.fr/mirrors/ftp.mandriva.com/MandrivaLinux/official/2010.0/i586/media/contrib/release
A chci z toho dostat řádky kde je urpmi --auto
Pak jsou tam další řádky jako:
deb http://archive.ubuntu.com/ubuntu/ dapper main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-updates main restricted universe multiverse
apt-get install firefox-3.5
apt-get install mc -y
apt-get install krusader -y
dpkg -i skype-ubuntu-intrepid_2.1.0.81-1_i386.deb
# dpkg -i startupmanager_1.9.12-1_all.deb
dpkg -i lives_1.1.4-1~getdeb1_i386.deb
A chci z toho dostat řádky kde je apt-get install nebo dpkg.
Zkoušel jsem zatím toto:
hledat="'urpmi'";
cat $0 | grep -E "$hledat";
Mělo by to vrátit více řádků ale vrací jen jeden. Navíc pokud zkusím toto:
hledat="'urpmi[:space:]'";
nebo toto
hledat="'urpmi[[:space:]]'";
nebo toto
hledat="'urpmi\s'";
tak to nenajde nic
-
tohle :
hledat="urpmi --auto"
grep "$hledat" file
mi normalne funguje
-
Tak už mi to funguje
hledat="^\s*urpmi[[:space:]]*--auto";
cat $script | grep -E "$hledat"
S těma jednoduchými uvozovkami to nejelo
Edit:
No a kdybych chtěl z toho odstranit řádky, které jsou součástí funkce codec?
function codecs {
if [ "$1" == "mandriva" ]; then
urpmi --auto FAAC
urpmi --auto lame
urpmi --auto codec
urpmi --auto win32-codecs
urpmi --auto real-codecs
urpmi --auto xanim-codecs
urpmi --auto mozilla-plugin-vlc
fi;
function basic {
if [ "$1" == "mandriva" ]; then
# urpmi --auto kate
urpmi --auto krusader
urpmi --auto opera
urpmi --auto wine
urpmi --auto gparted
fi;
Něco aby ta předloha obsahovala, že před ^\s*urpmi nesmí být slovo "codecs". Asi tuším, že bych to měl dát do závorek. Ale jak udělat tu negaci?
Edit 3 (poslední editace):
Úplně nejlepší by bylo definovat oblast textu ve které má hledat. Jde o funkci a o podmínku uvnitř.
Před tím musí být slovo "mandriva" a (NOR) před tím nesmí být slovo "codecs". A za tím (blokem) musí být fi;
Čili je to tak nějak:
funkce nazev1 {
if [ ".." == "mandriva" ]; then .... urpmi ... urpmi ...
fi;
}
funkce nazev2 {
if [ ".." == "mandriva" ]; then .... urpmi ... urpmi ...
fi;
}
-
Vymazat cast medzi function a fi, a potom vypisat vsetky urpmi sa da takto (ale nezarucuje ze za kazdym vypisanym riadkom este bude niekde aj nejake fi):
sed -n '/function codecs/,/fi/d;/^\s*urpmi --auto/p'
-
Vymazat cast medzi function a fi, a potom vypisat vsetky urpmi sa da takto (ale nezarucuje ze za kazdym vypisanym riadkom este bude niekde aj nejake fi):
sed -n '/function codecs/,/fi/d;/^\s*urpmi --auto/p'
Zkusil jsem to rozebrat a upravit, ale nefunguje mi to. Jedna věc je totiž funkce (končí špičatou závorkou) a druhá věc je ta podmínka (končí fi;).
content=$(cat $script | sed -n '/function codecs/,/}/d');
content=$(echo $content | sed -n '/mandriva/,/fi;}/p');
content=$(echo $content | sed -n '/^\s*urpmi --auto/p');
Vlastně ani v tom prvním příkazu nevidím žádný výsledek
Ty dva poslední příkazy asi fungují, ale na výstupu to vypadá jak kdyby tam nebyl oddělovač \n. On to asi nebude problém, select to zpracuje i tak.
-
mozna by stalo za to napsat co je cilem celeho grepovani.. jak na to koukam tak chcete udelat neco co by slo poresit nejak jednoduseji a ne neco grepovat...
-
Jde o to, odfiltrovat funkci codec (pryč s ní). A do výsledku zahrnout blok podmínky "mandriva". Nakonec (a to je cíl) vrátit řádky kde je urpmi. Jinými slovy, cílem je vrátit řádky kde je urpmi, ale netýká se to funkce "codecs" a týká se to pouze mandrivy.
Deadmail už sem napsal jednoduché řešení, jenom se ho teď snažím upravit, tak aby fungovalo tak jak jsem chtěl.
-
Jsem dementni koder a neumim nic, nez sedlacky grep.
Sorry.
cat $zadek | grep auto | grep mandriva
Jsem v haji.
Potrebuju heroin ;o)
-
Jsem dementni koder a neumim nic, nez sedlacky grep.
Sorry.
cat $zadek | grep auto | grep mandriva
Jsem v haji.
Potrebuju heroin ;o)
A jako dement tam asi pridam -i - protoze jsem demo. Kapitan demo. Chci si te pridat na fejsbuk.
LIDI VZBUDTE SE!!!!!!!!!!!!!!!!!!!!!!!!
easy.cz
-
Tohle mi taky nefunguje. Jenom aby mi to vrátilo celý text souboru kromě té funkce která se odstraní.
script=$0;
content=$(cat $script | sed -n '/function codecs/,/fi;/d');
Když vynechám -n tak se objeví výstup, ale vypadá to jak kdyby to vůbec nebylo profiltrováno:
content=$(cat $script | sed '/function codecs/,/fi;/d');
content=$(echo $content | sed -n '/mandriva/,/fi;}/p');
content=$(echo $content | sed '/^\s*urpmi[:space:]--auto/p');
Tak mi bylo sděleno, že toto nemůže fungovat protože sed pracuje jen po jednotlivých řádcích.
Řešení pomocí awk včetně selectu:
awk 'BEGIN{RS="\n}";FS="if"}
!/function codecs/{
for(i=1;i<=NF;i++){
if($i~/'$system'/){
m=split($i,u,"\n")
for(j=2;j<=m;j++) if(u[j]~/urpmi --auto/){print u[j]}
}
}
}' );
content=$content$'\E[1;33m\nKonec\E[1;0m';
# VYBRAT ŘÁDKY
clear; echo -e $'\E[1;33m''Vyber řádku:'$'\E[1;0m'; OLDIFS=$IFS; IFS=$'\n';
select line in $content; do
line=$(echo $line | # odfiltrovat funkci 'codecs' a vybrat řádky 'urpmi --auto', které jsou uvnitř podmínky '"mandriva"'
awk ... # zbyva doresit
break; done;