kereses config file -ban

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?

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ó.

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.....

perl vagy python. az awk meg a sed erre "sajtreszelővel rejszolás"...


#!/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";

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

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 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.

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.

Nem használtam, de van olyan, hogy sgrep (structured grep), érdemes ránézni.