LinuxForum.Fans
Тема

проверка переменных.

Автор: moshell 20 сообщений 4969 просмотров
#345855

Доброго времени суток, из текстового файла приходится вытаскивать некоторые значения.
Если б всегда эти текстовые файлы изготовлялись добросовестно, было бы легче и проще запихивать некоторые данные из этих файлов в переменные для будущего использования.
Но, не все так просто.

вопрос: существует ли какая либо утилита в linux которая выполняет проверку данных?
ну к примеру, если получившаяся переменная точно соответствует шаблону "\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>", то можно ее использовать, а если не соответствует, то выводить предупреждение?

или самому нужно городить кучу комбайнеров?

#345866

к примеру было бы круто, если можно было бы сделать вот так

text

if [[ "$var" = "\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>" ]]; then
command
fi

но не катит

#345956

А если нагуглить что либо про регулярные выражения в шелле? Например, элементарно находится следующее:

text
echo "$var" | grep -q "[a-z]*[0-9][a-z]*"
if [ $? -eq 0 ] ;then
    echo "match found"
else
    echo "match not found"
fi

Такой код не устроит?

Ну и такое тоже должно работать:

text
if [[  "$var" ==  "\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>"  ]]; then
command
fi
#346160

А почему не катит?
Оформи это в виде функции например.

#346186

Cruiser78
это вообще что?
"[a-z]*[0-9][a-z]*" аналог ldjIkk7lkdgfjfjkfjdf

Vascom написал:
А почему не катит?

не знаю чего то почему не катит.
"\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>"
если писать "[0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]"
то катит. опять же символов куча и границы слов...

#346311

посмотри на оператор =~ в man bash.
Но ЕМНИП работает он кривовато...

ИМХО если таких проверок будет очень много, то это хорошее время пересесть на перл...

#346315
Fat-Zer написал:
время пересесть на перл...

уже в процессе, кстати.

#346317

if [ var =~ $REGEX ] ...

но вообще, если можно избежать регекса, то лучше это сделать.

#346393

без regexp нельзя.
может быть
2-40-28-1991, а может быть
8-81-00-2013

if [ var =~ $REGEX ] ...
не работает

GNU bash, version 4.2.37(1)-release (i486-pc-linux-gnu)

#346649
"moshell" написал:
if [ var =~ $REGEX ] ...не работает

во-первых, там должно быть две [[
во-вторых, я уже говорил, что там это криво сделано т.е. должна быть именно переменная $REGEX, а не строка...

#346739
Fat-Zer написал:
[quote="moshell"]if [ var =~ $REGEX ] ...не работает

во-первых, там должно быть две [[
во-вторых, я уже говорил, что там это криво сделано т.е. должна быть именно переменная $REGEX, а не строка...[/quote]
да я уже понял. с двумя кстати тоже. я множество вариантов перепробовал. даже те что не описаны в mane (небесной)

в общем забиваю на баш. потихонечку учу perl
а в нем и "sed", и awk...
и grep более продвинутый!

#346894
"moshell" написал:
да я уже понял. с двумя кстати тоже. я множество вариантов перепробовал. даже те что не описаны в mane (небесной)

потому-что думать надо головой, а не перлом. УМВР, например проверка того, что в $X только цифры и пробелы:

text
$ REGEX="^[0-9 ]+$"; [[ "$X" =~ $REGEX ]]; echo $?
0

0 -- истинно
1 -- ложно
2 -- кривое регулярное выражение

Сам попробуй, это работает с любыми регулярками.

#346895

"moshell" написал:
if [ var =~ $REGEX ] ...
не работает
УМВР. Покажи команду целиком.
#346899
"moshell" написал:
не знаю чего то почему не катит.
"\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>"

в мане английским по по чёрному написано extended regular expression

Это значит, что < надо слешем экранировать, а вот { НЕ НУЖНО. Иначе она как { работает.

Но я не знаю, ЧТО ты понимаешь под < ? Если под "<" ты понимаешь "левая граница слова", то её НАДО экранировать, иначе НЕ НУЖНО. В любых RE.

#347505

Доктор, Вы как всегда выписываете рецепт после того как болезнь "уходит".
Так и хроническую заболеванию не долго получить.

#348930
Fat-Zer написал:
хорошее время пересесть на перл...

в итоге задрало меня постоянно бегать из портала маздай_to_линукс и обратно,
всяческие кодировки, перекодировки, символы новых строк и прочие шаманства.
поставил perl, поставил Spreadsheet::ParseXLSX
и теперь как никогда просто прочитать данные прямо из маздайного xlsx файла.
и с русским шрифтом проблем нет, и "несколькострочные" ячейки поборол, в общем красота :)
выводит поочередно все листы екселя в строчном виде, разделитель ячеек ";", разделитель несколькострочных ячеек символ "::" (мне так удобно)
кстати если почитать ман к модулю, данная штуковинища умеет работать еще много с чем в xlsx файлах.

Показать
#!/usr/bin/perl -w

use strict;
use Spreadsheet::ParseXLSX;
use Spreadsheet::ParseExcel::Cell;

binmode(STDOUT,':utf8');

my $filename = $ARGV[0] or die "Must specify filename to parse.\n";
my $parser = Spreadsheet::ParseXLSX->new;
my $workbook = $parser->parse( $filename );


if ( !defined $workbook ) {
die $parser->error(), ".\n";
}

for my $worksheet ( $workbook->worksheets() ) {

my ( $row_min, $row_max ) = $worksheet->row_range();
my ( $col_min, $col_max ) = $worksheet->col_range();

for my $row ( $row_min .. $row_max ) { #от минимального значения row_min до максимального row_max (строки)
for my $col ( $col_min .. $col_max ) {

my $cell = $worksheet->get_cell( $row, $col );
next unless $cell;
my $string = $cell->value();
$string =~ tr/\n/::/;
print $string,";";
}
print "\n";
}
}

кому надо - забирайте,
зуб даю, нет тут никакого патча Бармина

#348966

"moshell" написал:
октор, Вы как всегда выписываете рецепт после того как болезнь "уходит".
как увидел, так и прописал. Я рад, что вы вылечились и прочитали мануал.

"moshell" написал:
поставил perl, поставил Spreadsheet::ParseXLSX
и теперь как никогда просто прочитать данные прямо из маздайного xlsx файла.
и с русским шрифтом проблем нет, и "несколькострочные" ячейки поборол, в общем красота
ну... молодец.
#349623

в гнумерик входит конвертер

#350115
smaharbA написал:
в гнумерик входит конвертер

Мне нужен неинтерактивный, консольный тул.
К тому же у гнумерик целый килограм зависимостей

#350133

оно и так не интерактивное, а перловые модули мало зависимостей конечно же

Войдите или зарегистрируйтесь, чтобы ответить.