1

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

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

2

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

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

но не катит

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

3 (28.10.2013 23:16:28 отредактировано Cruiser78)

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

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

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

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

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

4

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

5 (30.10.2013 12:43:51 отредактировано moshell)

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]"
то катит. опять же символов куча и границы слов...

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

6

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

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

95% процентов проблем находятся между клавиатурой и стулом.

7

Fat-Zer пишет:

время пересесть на перл...

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

8 (30.10.2013 20:57:11 отредактировано dyasny)

if [ var =~ $REGEX ] ...

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

9

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

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

10

moshell пишет:

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

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

95% процентов проблем находятся между клавиатурой и стулом.

11

Fat-Zer пишет:
moshell пишет:

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

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

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

12

moshell пишет:

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

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

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

13

moshell пишет:

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

УМВР. Покажи команду целиком.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

14

moshell пишет:

не знаю чего то почему не катит.
"\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>"

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

16 (13.11.2013 00:19:30 отредактировано moshell)

Fat-Zer пишет:

хорошее время пересесть на перл...

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

17

moshell пишет:

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

как увидел, так и прописал. Я рад, что вы вылечились и прочитали мануал.

moshell пишет:

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

ну... молодец.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

18

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

Я конечно далек от мысли...(с)

19

smaharbA пишет:

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

20

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

Я конечно далек от мысли...(с)