Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: Dark_Dreamer в Dec 26, 2008, 02:40



Титла: Помощ за един лесничък скрипт
Публикувано от: Dark_Dreamer в Dec 26, 2008, 02:40
Здравейте нов съм в програмирането на скриптове  и имам нужда от вашата помощ за следния скрипт:

Substitution of text within a file: Now suppose you wanted to find and replace some words in a text file. You could do this manually using find and replace in a text editor. However, you could also write a script to automate the task. Here is an example which replaces 'plus' with '+':

echo "x is 5 plus 6" | sed 's/plus/+/g'
We now use sed instead of grep. In the expression s/plus/+/g, the 's' means substitute the second part (separated by '/') for the first and the 'g' means do this everywhere rather than just on the first occurrence. However it is possible to write this in one line (without error checking) using regular expressions. Below is a template, can you fill in the regular expression?

#!/bin/sh
expr `echo $* | sed ''`
exit 0

Въобще нямам представа как да го напиша този скрипт   :(


Титла: Re: Помощ за един лесничък скрипт
Публикувано от: Dark_Dreamer в Dec 27, 2008, 18:17
wow 100 vijdaniq na temata nikoi li ne moje da pomogne!?


Титла: Re: Помощ за един лесничък скрипт
Публикувано от: radoulov в Dec 27, 2008, 20:37
Аз лично, не мога да разбера въпроса ...

Цитат
However it is possible to write this in one line (without error checking) using regular expressions

?

Регулярните изрази извършват matching, не substitution.

Цитат
Below is a template, can you fill in the regular expression

Къде точно?

Код:
expr `echo $* | sed ''`


Титла: Re: Помощ за един лесничък скрипт
Публикувано от: Dark_Dreamer в Dec 27, 2008, 22:16
ами просто копи пастнах условието защото е от един енг саит, накратко какво трябва да прави скрипта е като го рънваш в терминала заедно с някакъв текст които съдържа думата plus да замени тази дума с знака +


Например да кажем че програмта се казва neshtosi

$ ./neshtosi x is 5 plus 6 plus 7 plus 8

да изведе на екрана

x is 5 + 6 + 7 + 8


Титла: Re: Помощ за един лесничък скрипт
Публикувано от: cdiem в Dec 28, 2008, 00:20
>Например да кажем че програмта се казва neshtosi
>
>$ ./neshtosi x is 5 plus 6 plus 7 plus 8
>
>да изведе на екрана
>
>x is 5 + 6 + 7 + 8

Не разбирам защо е сложено expr ``. Иначе програмата може да бъде например:
---------------------------------------
#!/bin/sh
echo $* | sed 's/plus/+/g'
exit 0
--------------------------------------
Може би има и вариант с expr; просто може би не съм достатъчно добър да мога да го напиша.
Ето и вариант на Perl (може да не е много елегантен, но работи):
--------------------------------------
#!/usr/bin/perl -w
map { $_ =~ s/plus/+/; print "$_ ";} @ARGV;
print "\n";
-------------------------------------


EDIT: видях защо е поставено expr `` - за да сметне израза след заместването на 'plus' с '+' ( http://en.wikibooks.org/wiki/Shell_Programming#expr_command ). Тогава shell-скриптът ще бъде нещо такова:
---------------------------------------
#!/bin/sh
expr `echo $* | sed 's/plus/+/g'`
exit 0
--------------------------------------
Но ще трябва да го извикваш с нещо такова (при мен скриптът се казва zz.sh):
cdiem@cdiemst:~$ ./zz.sh 5 plus 7 plus 6
18
cdiem@cdiemst:~$

В първия вариант по-горе (без expr):
cdiem@cdiemst:~$ ./zz.sh 5 plus 7 plus 6
5 + 7 + 6
cdiem@cdiemst:~$


Титла: Re: Помощ за един лесничък скрипт
Публикувано от: radoulov в Dec 28, 2008, 20:22
Или с GNU sed(заради -r) и bash:

Код:
$ ./s x is 5 plus 6 plus 7 plus 8
x is 26
$ cat s
#!/bin/bash

eval $(sed -r 's/plus/+/g;s/([^0-9]*)([0-9].*)/echo \1 $((\2))/'<<<$@)

С Perl:

Код:
$ perl -le'
 ($_ = shift) =~ s/plus/+/g;
 /(\D*)(.*)/ and print $1, eval $2
  ' 'x is 5 plus 6 plus 7 plus 8'
x is 26



Титла: Re: Помощ за един лесничък скрипт
Публикувано от: Dark_Dreamer в Dec 29, 2008, 20:31
blagodarq i na dvamata! nz za6to e dadeno s expr i az no 6te go mahna za6toto qvno sigurno ne6to ne e kakto trqbva.