Van egy config fajlom:
aaa {
bbb {
ccc
}
}
ddd {
eee {
fff {
ggg
}
}
}
ebben hogy tudnek keresni egy reszt a zarojelparok kozott?
pl. ha bbb -re keresek akkor ez jojjon vissza
bbb {
ccc
}
ha eee-re
eee {
fff {
ggg
}
}
a zarojelek szama valtozo
awk sed vagy barmi mas esetleg?
- 3066 megtekintés
Hozzászólások
Parasztos megoldás helyette, de azt hiszem a pureftpd is így tesz: 1 info vagy info csoport = 1 config fájl.
Vagy név: érték 1-1 sorban. Ennél az esetnél elég rágreppelni az adott névre és a 2. oszlopból megkapod az értéket. Ez elég gyorsan feldolgozható.
- A hozzászóláshoz be kell jelentkezni
de ezek mind kulon sorok
valami olyasmi kene mint a braces matching...
ezt szeretnem:
mondjuk ha rakeresek erre
aaa {
akkor ezt adja vissza
aaa {
bbb {
ccc
}
}
es ha mondjuk erre
fff {
akkor ezt
fff {
ggg
}
egy zarojelparon belul akarmennyi zarojelpar lehet es abban meg abban.... is
nem tudom, hogy erre van-e kesz megoldas; vagy irnom kell par fuggvenyt ami megkeresi a kovetkezo olyan zaro zarojelet aminek nincsen nyito zarojele.....
- A hozzászóláshoz be kell jelentkezni
perl vagy python. az awk meg a sed erre "sajtreszelővel rejszolás"...
- A hozzászóláshoz be kell jelentkezni
+1
Erre tényleg be kell vetni egy kis programozást. Shellből ezt már nem érdemes vakircálni.
- A hozzászóláshoz be kell jelentkezni
#!/usr/bin/perl
$str="aaa {
bbb {
ccc
}
}
ddd {
eee {
fff {
ggg
}
}
}";
use Text::Balanced qw(extract_bracketed);
$l = 'eee';
$x = extract_bracketed( $str, '{}', qr/(?s).*?$l\s*/ );
print "$l $x\n";
- A hozzászóláshoz be kell jelentkezni
Szerintem a legegyszerűbb egy kész megoldást keresni. A confuse elég hasonló szerkezetű, a libjét próbáld használni, ha nem lesz jobb megoldás.
- A hozzászóláshoz be kell jelentkezni
Koszonom a segitseget majd kiprobalom oket, de egyelore egy fuggvenyt irtam...(mivel bashben hasznalnam)
blocksearch()
{
#parameter 1: filename
#parameter 2: begin brace
#parameter 3: end brace
#parameter 4: search regexp
beginbrace=0
endbrace=0
sumbrace=0
cat "$1" | grep -n -e "$4" | sed -r 's/^([0-9]*)[\:].*/\1/g' | while IFS= read matchline
do
beginbrace=0
endbrace=0
sumbrace=0
sed "1,$(echo $(($matchline-1)))"d "$1" | while IFS= read fileline
do
beginbrace=$(echo $fileline | grep -o "$2" | wc -l)
endbrace=$(echo $fileline | grep -o "$3" | wc -l)
sumbrace=$(echo $(($sumbrace+$beginbrace-$endbrace)))
echo $fileline
if [[ $sumbrace == "0" ]]
then
break
fi
done
done
}
es a meghivasa:
blocksearch "fajlnev" "{" "}" "valami regexp ami kell"
biztos lehetne szebben is, de majd akkor kijavit valaki
- A hozzászóláshoz be kell jelentkezni
Jobb lenne a '[ c o d e ]' -ot használni; sed-et, grep-et, wc-t meg nem használni:
#!/bin/bash
blocksearch() {
let c=0
while read line ; do
if [[ $line =~ $2 ]]
then let c=1
else
if [[ $c>0 && $line =~ '{' ]]
then let c++
fi
fi
((c>0)) && echo $line
[[ $line =~ '}' ]] && let c--
done < $1
}
blocksearch example.conf eee
- A hozzászóláshoz be kell jelentkezni
A teljesség kedvéért álljon itt egy perl egysoros:
perl -ne 'BEGIN{$s=shift}$m++if/$s/;if($m){$c++if/\{/;$c?print:exit;$c--if/\}/}' eee braces.txt
Első paraméter a keresendő szöveg, második a fájlnév.
- A hozzászóláshoz be kell jelentkezni
Értem én hogy egysoros, de mér olyan hoooosssszzzúúúú? ;-)
perl -ne 'BEGIN{$s=shift}print,$c+=/{/-/}/ if/$s/+$c>0' eee braces.txt
- A hozzászóláshoz be kell jelentkezni
Ott a pont :)
Még két karaktert lehet spórolni, ha megfordítjuk a paraméterek sorrendjét, továbbá a >0 sem kell:
perl -ne 'BEGIN{$s=pop}print,$c+=/{/-/}/ if/$s/+$c' braces.txt eee
Abban tér még el a te megoldásod az enyémtől, hogy a tied az összes eee blokkot kiírja, míg az enyém az első után kilép - igaz, ez nem volt specifikálva a feladatban.
- A hozzászóláshoz be kell jelentkezni
Így most lefaraghatom a BEGIN-t :-)
perl -ne '$s||=pop;print,$c+=/{/-/}/ if/$s/+$c' braces.txt eee
- A hozzászóláshoz be kell jelentkezni
Nem használtam, de van olyan, hogy sgrep (structured grep), érdemes ránézni.
- A hozzászóláshoz be kell jelentkezni