Доброго времени суток, из текстового файла приходится вытаскивать некоторые значения.
Если б всегда эти текстовые файлы изготовлялись добросовестно, было бы легче и проще запихивать некоторые данные из этих файлов в переменные для будущего использования.
Но, не все так просто.
вопрос: существует ли какая либо утилита в linux которая выполняет проверку данных?
ну к примеру, если получившаяся переменная точно соответствует шаблону "\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>", то можно ее использовать, а если не соответствует, то выводить предупреждение?
или самому нужно городить кучу комбайнеров?
проверка переменных.
к примеру было бы круто, если можно было бы сделать вот так
if [[ "$var" = "\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>" ]]; then
command
fi
но не катит
А если нагуглить что либо про регулярные выражения в шелле? Например, элементарно находится следующее:
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А почему не катит?
Оформи это в виде функции например.
Cruiser78
это вообще что?
"[a-z]*[0-9][a-z]*" аналог ldjIkk7lkdgfjfjkfjdf
А почему не катит?
не знаю чего то почему не катит.
"\<[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]"
то катит. опять же символов куча и границы слов...
посмотри на оператор =~ в man bash.
Но ЕМНИП работает он кривовато...
ИМХО если таких проверок будет очень много, то это хорошее время пересесть на перл...
время пересесть на перл...
уже в процессе, кстати.
if [ var =~ $REGEX ] ...
но вообще, если можно избежать регекса, то лучше это сделать.
без regexp нельзя.
может быть
2-40-28-1991, а может быть
8-81-00-2013
if [ var =~ $REGEX ] ...
не работает
GNU bash, version 4.2.37(1)-release (i486-pc-linux-gnu)
if [ var =~ $REGEX ] ...не работает
во-первых, там должно быть две [[
во-вторых, я уже говорил, что там это криво сделано т.е. должна быть именно переменная $REGEX, а не строка...
[quote="moshell"]if [ var =~ $REGEX ] ...не работает
во-первых, там должно быть две [[
во-вторых, я уже говорил, что там это криво сделано т.е. должна быть именно переменная $REGEX, а не строка...[/quote]
да я уже понял. с двумя кстати тоже. я множество вариантов перепробовал. даже те что не описаны в mane (небесной)
в общем забиваю на баш. потихонечку учу perl
а в нем и "sed", и awk...
и grep более продвинутый!
да я уже понял. с двумя кстати тоже. я множество вариантов перепробовал. даже те что не описаны в mane (небесной)
потому-что думать надо головой, а не перлом. УМВР, например проверка того, что в $X только цифры и пробелы:
$ REGEX="^[0-9 ]+$"; [[ "$X" =~ $REGEX ]]; echo $?
00 -- истинно
1 -- ложно
2 -- кривое регулярное выражение
Сам попробуй, это работает с любыми регулярками.
УМВР. Покажи команду целиком.if [ var =~ $REGEX ] ...
не работает
не знаю чего то почему не катит.
"\<[0-9]-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}\>"
в мане английским по по чёрному написано extended regular expression
Это значит, что < надо слешем экранировать, а вот { НЕ НУЖНО. Иначе она как { работает.
Но я не знаю, ЧТО ты понимаешь под < ? Если под "<" ты понимаешь "левая граница слова", то её НАДО экранировать, иначе НЕ НУЖНО. В любых RE.
Доктор, Вы как всегда выписываете рецепт после того как болезнь "уходит".
Так и хроническую заболеванию не долго получить.
хорошее время пересесть на перл...
в итоге задрало меня постоянно бегать из портала маздай_to_линукс и обратно,
всяческие кодировки, перекодировки, символы новых строк и прочие шаманства.
поставил perl, поставил Spreadsheet::ParseXLSX
и теперь как никогда просто прочитать данные прямо из маздайного xlsx файла.
и с русским шрифтом проблем нет, и "несколькострочные" ячейки поборол, в общем красота :)
выводит поочередно все листы екселя в строчном виде, разделитель ячеек ";", разделитель несколькострочных ячеек символ "::" (мне так удобно)
кстати если почитать ман к модулю, данная штуковинища умеет работать еще много с чем в xlsx файлах.
Показать
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";
}
}
кому надо - забирайте,
зуб даю, нет тут никакого патча Бармина
как увидел, так и прописал. Я рад, что вы вылечились и прочитали мануал.октор, Вы как всегда выписываете рецепт после того как болезнь "уходит".
ну... молодец.поставил perl, поставил Spreadsheet::ParseXLSX
и теперь как никогда просто прочитать данные прямо из маздайного xlsx файла.
и с русским шрифтом проблем нет, и "несколькострочные" ячейки поборол, в общем красота
в гнумерик входит конвертер
в гнумерик входит конвертер
Мне нужен неинтерактивный, консольный тул.
К тому же у гнумерик целый килограм зависимостей
оно и так не интерактивное, а перловые модули мало зависимостей конечно же