Функция Perl - unpack и bash
Модератор: Модераторы разделов
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Функция Perl - unpack и bash
Есть определённый скрипт на perl. В нем есть часть, которая занимается тем, что считывает текстовый файл построчно, разбивает строку с помощью команды unpack и распихивает по переменным. Необходимо реализовать это с помощью баш-скрипта. Например есть строка: "11 22 33". Пробовал с помощью функции cut ( tmp=`echo $line | cut -bN-M` ). Но он воспринимает 2 пробела, как один символ. Мне же надо, чтоб один пробел - воспринимался как один символ. Подскажите пожалуйста, как это можно сделать, заранее благодарен.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Функция Perl - unpack и bash
Можешь более разумно как-то пример привести того что есть, и того что надо из этого получить? с пробелами совсем не понятно.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Ну более разумно, только так.
Есть строка: 1 2 пробел№1 пробел№2 5 6 пробел№3 пробел№4 9 9
Где пусто, он выводит пусто, что собственно, я так понимаю и есть 2 пробела.
А вот с башем проблемы, если воспользоватся функцией cut и таже самая строка то:
А надо, чтобы процедура выполнялась, также как и на пёрле. Чтобы любой символ воспринимался как один символ. Это необходимо для корректного разбиеня строки по переменным. В баше же, как видно в случае с пробелами, возникает проблема, получается перекос.
Есть строка: 1 2 пробел№1 пробел№2 5 6 пробел№3 пробел№4 9 9
Код:
my $line="12 56 99";
my ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$line);
print "$a\n"; # Здесь выведется : 12
print "$b\n"; # Здесь выведется : пусто (или 2 пробела)
print "$c\n"; # Здесь выведется : 56
print "$d\n"; # Здесь выведется : пусто (или 2 пробела)
print "$e\n"; # Здесь выведется : 99
Где пусто, он выводит пусто, что собственно, я так понимаю и есть 2 пробела.
А вот с башем проблемы, если воспользоватся функцией cut и таже самая строка то:
Код:
line="12 56 99"
a=`echo $line | cut -b1-2`
b=`echo $line | cut -b3-4`
c=`echo $line | cut -b5-6`
d=`echo $line | cut -b7-8`
e=`echo $line | cut -b9-10`
echo $a # Здесь выведется : 12
echo $b # Здесь выведется : 5
echo $c # Здесь выведется : 6
echo $d # Здесь выведется : 99
echo $e # Здесь выведется : пусто ( или два пробела)
А надо, чтобы процедура выполнялась, также как и на пёрле. Чтобы любой символ воспринимался как один символ. Это необходимо для корректного разбиеня строки по переменным. В баше же, как видно в случае с пробелами, возникает проблема, получается перекос.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Rootlexx
- Бывший модератор
- Сообщения: 4471
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: Функция Perl - unpack и bash
Naruto-kun
Используйте awk:
Используйте awk:
Код: Выделить всё
[rootlexx@localhost ~]$ echo "a b c d" | awk '{ print $3 }'
c
[rootlexx@localhost ~]$-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Функция Perl - unpack и bash
Rootlexx писал(а): ↑17.11.2008 18:05Naruto-kun
Используйте awk:
Код: Выделить всё
[rootlexx@localhost ~]$ echo "a b c d" | awk '{ print $3 }' c [rootlexx@localhost ~]$
в том то и дело что $3 - должен быть пробел....
а почему бы не так:
Код: Выделить всё
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $a;' `; echo $a
12
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $b;' `; echo $a
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $c;' `; echo $a
56
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $d;' `; echo $a
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $e;' `; echo $a
99
diesel@indie:~/scripts/imapsync$-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Naruto-kun
Используйте awk:
Код
[rootlexx@localhost ~]$ echo "a b c d" | awk '{ print $3 }'
c
[rootlexx@localhost ~]$
Нет, это не подходит. Возможно я неккоректно выразился. Попробую ещё раз.
У меня есть строка 1 2 пробел№1 пробел№2 5 6 пробел№3 пробел№4 9 9.
Есть 5 переменных: a,b,c,d,e. Мне необходимо, чтобы он в a записал какое-то кол-во символов и соотвственно в оставшиеся переменные, тоже какое-то кол-во символов. Если считывая какое-то кол-во символов, я получаю, что они все пробелы, то получается, переменная не определена, нет для неё значения.Почему мне и нужно, чтобы один пробел считался как один символ.
Цитата(Rootlexx @ Nov 17 2008, в 17:05) *
Naruto-kun
Используйте awk:
Код
[rootlexx@localhost ~]$ echo "a b c d" | awk '{ print $3 }'
c
[rootlexx@localhost ~]$
в том то и дело что $3 - должен быть пробел....
а почему бы не так:
Код
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $a;' `; echo $a
12
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $b;' `; echo $a
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $c;' `; echo $a
56
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $d;' `; echo $a
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line" | perl -e ' $_=<>; ($a,$b,$c,$d,$e)=unpack("A2 A2 A2 A2 A2",$_); print $e;' `; echo $a
99
diesel@indie:~/scripts/imapsync$
хм, а здесь команда perl, я так понимаю является использование пёрла? Если да, то тоже не подходит. Мне нужно абсолютно независимый от пёрла скрипт.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Функция Perl - unpack и bash
ну удачи
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Хм, вот сосбна используя баш. Без пёрла никак, не релизовать данную задачу?
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Функция Perl - unpack и bash
Naruto-kun писал(а): ↑17.11.2008 18:21Хм, вот сосбна используя баш. Без пёрла никак, не релизовать данную задачу?
Код: Выделить всё
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line"|sed -e 's/^\([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\)/\1/g'`; echo $a
12
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line"|sed -e 's/^\([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\)/\2/g'`; echo $a
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line"|sed -e 's/^\([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\)/\3/g'`; echo $a
56
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line"|sed -e 's/^\([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\)/\4/g'`; echo $a
diesel@indie:~/scripts/imapsync$ line='12 56 99'; a=`echo "$line"|sed -e 's/^\([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\)/\5/g'`; echo $a
99или чтобы много раз много не писать:
Код: Выделить всё
diesel@indie:~/scripts/imapsync$ function getsub { echo "$1" | sed -e 's/^\([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\)/\'$2'/g'; }
diesel@indie:~/scripts/imapsync$ getsub '12 56 99' 1
12
diesel@indie:~/scripts/imapsync$ getsub '12 56 99' 2
diesel@indie:~/scripts/imapsync$ getsub '12 56 99' 3
56
diesel@indie:~/scripts/imapsync$ getsub '12 56 99' 4
diesel@indie:~/scripts/imapsync$ getsub '12 56 99' 5
99-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Спасибо, попробую.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Покопался с предложенной вами функцией. Обнаружил, что использовать вашу функцию, будет для меня весьма проблематично, ибо файл с которым я работаю, состоит из строк, длиной ~151 символ. Длина переменных, на которые разбиваются строки, колеблется от 1 до 28 символа. В строках встречаются и цифры и буквы, иногда пробелы(собственно, в моём случае, значит не будет определена переменная). Может есть, другой способ, или всё таки просто разобраться с тем, что вы предложили, просто добавив в неё недостающие части строки?
ps. Единственное, что облегчает задачу, то что все строки разбиваются одинаково.
ps. Единственное, что облегчает задачу, то что все строки разбиваются одинаково.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Функция Perl - unpack и bash
Naruto-kun писал(а): ↑18.11.2008 17:20Покопался с предложенной вами функцией. Обнаружил, что использовать вашу функцию, будет для меня весьма проблематично, ибо файл с которым я работаю, состоит из строк, длиной ~151 символ.
Штука ведь не в длине собственно строки а в количестве полей.
Naruto-kun писал(а): ↑18.11.2008 17:20Может есть, другой способ, или всё таки просто разобраться с тем, что вы предложили, просто добавив в неё недостающие части строки?
мну в голову ниче окромя как такой подстановки не приходит. то есть делать регексп описывающий строку разбитую на поля разделенные пробелом, и отдельные куски этого регеспа вырезать.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Понятно. А если быть точным то строки длиной 151 символов делятся на 18 переменных.Чтобы было понятнее, вот разбиение на пёрле:
Собственно, пока так и не смог преоброзовать ваш пример для этого случая. Не до конца разобрался в тонкостях sed. Щас вот сижу ковываряю. Если будут ещё какие-либо предложения, буду только рад.
Код:
my ($linenum,$ntrx,$pan,$opctype,$trxsign,$trxsum,$trxcur,$feesum,
$feecur,$feesign,dttrx,$tmtrx,$syst,$auth,$rez,$crdgrp,$ntrxp,$eqcod)
=unpack("x3 A10 A12 A28 A3 A3 A15 A3 A15 A3 A3 A10 A8 A4 A6 A1 A4 A12 A8",$line);Собственно, пока так и не смог преоброзовать ваш пример для этого случая. Не до конца разобрался в тонкостях sed. Щас вот сижу ковываряю. Если будут ещё какие-либо предложения, буду только рад.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Функция Perl - unpack и bash
Naruto-kun писал(а): ↑19.11.2008 12:06Понятно. А если быть точным то строки длиной 151 символов делятся на 18 переменных.Чтобы было понятнее, вот разбиение на пёрле:
Код:
my ($linenum,$ntrx,$pan,$opctype,$trxsign,$trxsum,$trxcur,$feesum, $feecur,$feesign,dttrx,$tmtrx,$syst,$auth,$rez,$crdgrp,$ntrxp,$eqcod) =unpack("x3 A10 A12 A28 A3 A3 A15 A3 A15 A3 A3 A10 A8 A4 A6 A1 A4 A12 A8",$line);
Собственно, пока так и не смог преоброзовать ваш пример для этого случая. Не до конца разобрался в тонкостях sed. Щас вот сижу ковываряю. Если будут ещё какие-либо предложения, буду только рад.
там все просто, примерно тоже самое что и в перле:
sed -e 's/^\([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\) \([0-9]*\)/\'$2'/g'; }
"\([0-9]*\) " - строка состоящая из какого-то колличества цифр, за которой следует пробел. повторяется столько раз - сколько переменных - у тебя из 18 - значить надо 18. если не только цифры, а и буквы соответственно будет [0-9a-zA-Z].
"/\'$2'/" - второй элемент замены - $2 - это второй параметр функции, который передаеется sed'у чтобы получить \n, где n - номер скобочки который будет подставлен и выдан как исходный результат.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Это я опытным путём вроде как понял. Но вот у меня же между переменными пробелов почти нет. Пробел в строке файла стоит только в том случае, если нет переменной.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Функция Perl - unpack и bash
Naruto-kun писал(а): ↑19.11.2008 12:24Это я опытным путём вроде как понял. Но вот у меня же между переменными пробелов почти нет.
эм в изначальном примере с цифрами переменные разделялись пробелами и ежели переменной не было - то ее не было, а просто стоял еще один пробел. мну с перловыми pack/unpack никогда не сталкивался, поэтому что template означает сходу не понимаю.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
diesel писал(а): ↑19.11.2008 12:30Naruto-kun писал(а): ↑19.11.2008 12:24Это я опытным путём вроде как понял. Но вот у меня же между переменными пробелов почти нет.
эм в изначальном примере с цифрами переменные разделялись пробелами и ежели переменной не было - то ее не было, а просто стоял еще один пробел.
Простите, видимо я как всегда плохо объяснил.
Как уже сказал, пробел, только если нет переменной, т.е. вместо неё. Между переменными пробелов нет.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Всё вроде бы разобрался, по крайней мере работает.
Правда для строк длиной 151 символ получится длинная комманда. Всем кто помогал большое спасибо. Если кто-то предложит более лучший вариант буду благодарен.
Код:
function getsub { echo "$1" | sed -e 's/^\([0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ]\)/\'$2'/g'; }
#function getsub { echo "$1" | sed -e 's/^\([0-9a-zA-Z][0-9a-zA-Z]\)\([0-9a-zA-Z][0-9a-zA-Z]\)/\'$2'/g'; }
getsub '43 21' 1 # Выводит 43, что и нужноПравда для строк длиной 151 символ получится длинная комманда. Всем кто помогал большое спасибо. Если кто-то предложит более лучший вариант буду благодарен.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Хмм, решил ещё раз попробовать на строке длиной 151 символ, получившююся функцию. Где-то видимо я ошибся.
Выводит ошибку: sed: command garbled
А насколько я понял, это означает, что я ошибся в выражении.
Код:
line="3331111111111dghfgjsdgfsfg sdgfhsgfsfs fhsdgfjsguyrgtwytfbsdfjs fgsdhfgsuyfgsufgsdf gfdhsghfjsdy ysgfhsfguyguy yg fysgdfygsuyd fsgdyfgysgdyfggfhdgj"
function getsub {
echo "$line" | sed -e 's/^\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)
\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ] [0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)
\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]
[0-9a-zA-Z ][0-9a-zA-Z ]\)\([0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ][0-9a-zA-Z ]\)/\'$1'/g'; }
getsub 1Выводит ошибку: sed: command garbled
А насколько я понял, это означает, что я ошибся в выражении.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Функция Perl - unpack и bash
Naruto-kun писал(а): ↑19.11.2008 12:35diesel писал(а): ↑19.11.2008 12:30Naruto-kun писал(а): ↑19.11.2008 12:24Это я опытным путём вроде как понял. Но вот у меня же между переменными пробелов почти нет.
эм в изначальном примере с цифрами переменные разделялись пробелами и ежели переменной не было - то ее не было, а просто стоял еще один пробел.
Простите, видимо я как всегда плохо объяснил.![]()
Как уже сказал, пробел, только если нет переменной, т.е. вместо неё. Между переменными пробелов нет.
тогда так просто не будет работать и задача сильно усложнится.
ЗЫ: в вашем регекспе там еще надо учитывать "или символы или пробел".
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
собсвтвенно я это учёл, сделав "[0-9a-zA-Z ]", насколько я понял, так я смогу учитывать пробел, на практике это работает. Но возникла трудность строчку длиной 77 символов я разбиваю нормально. Но вот длиной большей, проверял на 151 символе, выдаёт ошибку, собственно проверил ещё на длине 108, тоже ошибка. Может есть какое-то ограничения на длину команды sed, в смысле то что стоит в ' '
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Перекопал весь свой получившийся тестовый пример. Никаких вроде бы ошибок синтаксиса не нашёл.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Тема по прежнему актуальна. Решение так пока верное и не нашёл.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
Re: Функция Perl - unpack и bash
Всё проблема наконец решена. Я бы сказал это почти полная аналогия фукнции unpack в пёрле.
Собственно, именно то я так долго искал. Оказалось всё дествительно просто.
ps. Тему можно закрывать или удалять. Ещё раз спасибо всем, кто помог.
Код:
#!/bin/bash
string="123 567e8"
a=`echo ${string:0:3}`
b=`echo ${string:3:2}`
c=`echo ${string:5:5}`
echo $a # Выведется 123
echo $b # Выведется 2 пробела
echo $c # Выведтся 567e8Собственно, именно то я так долго искал. Оказалось всё дествительно просто.
ps. Тему можно закрывать или удалять. Ещё раз спасибо всем, кто помог.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Если на вопрос ни кто не знает ответа, то пора читать описание.