LINUX.ORG.RU

Помогите извлечь цифру из файла?

 , ,


0

3

Пробовал и не получается у меня. Есть конфиг-файл с текстом ~/conf:

[Global]
res_fix="xrandr -s 1280x1024"
Ncomp="20"
Height="1024"
Width="1280"

Нужно из него извлечь значение Ncomp. Как из него получить цифру 20 ?

Пробовал по строках файла но что-то не так.

#!/bin/bash
#
filename="~/conf"
while read -r line
do
    name="$line"
    echo  $name

 if [[ 'grep 'Ncomp' $name' ]];then
   echo 55;
 fi

done < "$filename"
★★

e=`cat ~/conf | grep Ncomp` && eval $e && echo $Ncomp

Например. Но не скажу что использование eval в данном случае сильно здравая идея. Зато просто :-)

Но правильнее будет, конечно что-то вроде:

cat ~/conf | grep Ncomp | sed -r 's/^[^0-9]*([0-9]+).*/\1/'

dmiceman ★★★★★
()

sed -n 's/Ncomp=«\([0-9]*\)»/\1/p' ~/conf

mky ★★★★★
()
import configparser
c=configparser.ConfigParser()
c.read(...)
print(c['Global']['Ncomp'].strip('"'))
anonymous
()
perl -lne 'print $1 if /Ncomp="(\d+)"/' ~/path/to/config
anonymous
()
grep -Po 'Ncomp="\K\d+' ~/conf
Deleted
()

Так и знал, что сейчас посыпятся однострочники с grep/perl/awk/sed. Даже ash умеет Parameter Expansion, а bash даже regex умеет. Накой при наличии bash вам дался grep?

vodz ★★★★★
()

if [[ 'grep 'Ncomp' $name' ]];then

Что это за язык?

Как из него получить цифру 20?

Точно так же, как и любое другое поле.

#!/bin/bash

trim ()
{
    local c="$2"
    local s="$3"
    if [[ $s == "$c"*"$c" ]]; then
        s="${s%$c}"
        s="${s#$c}"
        declare -g $1="$s"
    fi
}

declare -A CONF

while read -r line; do
    [[ $line == *[^=]=[^=]* ]] || continue
    IFS='=' read key value <<< "$line"
    [[ -n $key ]] || continue
    trim value '"' "$value"
    CONF[$key]="$value"
done

printf '%s\n' "${CONF[Ncomp]}"

Не проверял.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от abbat81

В вашем цикле делаете name=${line%=*} , проверяете, что Ncomp = $name, значение получаете как value=${line#*=}, если надо избавиться от кавычек, то можно так:

if [[ ${value:0:1} = '"' && ${value:${#value}-1:1} = '"' ]] ; then
        value=${value:1:${#value}-2}
fi

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Ну да, вложенные не распарсит, regex с подвыражениями и BASH_REMATCH - не стандартны даже в bash (например с 3 и 4 версией), а eval крайне не желательно юзать без полного контроля того, что ему кормится. Оно, конечно лучше переписать как '«' = »${...", но это уже для домашнего задания.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.