Нужна помощь в скрипте с заменой строк (Нужна помощь в скрипте с заменой строк)

Модератор: Модераторы разделов

socr
Сообщения: 35
ОС: Ubuntu Linux

Нужна помощь в скрипте с заменой строк

Сообщение socr »

Добрый день, есть фаил, в котором находиться текст. Надо заменить строки текста в которых есть указанное слово, на произвольную цтрочку(подаётся как параметр). Использовать только /bin/sh возможности. Я тут подумал, поидее ход действий должен быть такой(ето как я его понимаю):
1. По строке считываем файл
2. Провериаем есть ли такое слово
3. Если есть заменяем на нужную строку и записываем в файл
4. Если нету, то оставлияем без изменениж

Может кто подскажет как ето в Никсах сделать???
Спасибо сказали:
Аватара пользователя
Luinnar
Сообщения: 246
ОС: Solaris, Debian, Ubuntu

Re: Нужна помощь в скрипте с заменой строк

Сообщение Luinnar »

socr писал(а):
21.10.2008 14:02
Может кто подскажет как ето в Никсах сделать???

Ваше ограничение (что можно только sh использовать) подразумевает отказ от таких стандартных средств, как sed и awk?
Если нет, то проще всего для замены использовать sed:
sed "s/$1/$2/g"
Однако учтите, что в $1 и $2 не должно быть обратных слэшей, либо можно использовать другой разделитель:
sed "s@$1@$2@g"
(в этом варианте нельзя символ @ в строках использовать).
Спасибо сказали:
socr
Сообщения: 35
ОС: Ubuntu Linux

Re: Нужна помощь в скрипте с заменой строк

Сообщение socr »

да, подразумевается отказ от sed, awk, perl и т.д.
С sed я это сделал, надо как-то без него
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Нужна помощь в скрипте с заменой строк

Сообщение diesel »

Код: Выделить всё

#!/bin/sh

while read i; do
    if [ "$i" = "$2" ]; then
        echo $3
    else
        echo $i;
    fi
done < $1

первый аргумент - файл
второй аргумент - строка которую заменять
третий аргумент - строка на которую заменять

_только_ /bin/sh regexp'ы для строк будет очень сложно сделать.
Спасибо сказали:
Аватара пользователя
Gogast
Сообщения: 549
ОС: Gentoo amd64

Re: Нужна помощь в скрипте с заменой строк

Сообщение Gogast »

может вы от bash откажетесь?
Без виндовза 3 года
Спасибо сказали:
socr
Сообщения: 35
ОС: Ubuntu Linux

Re: Нужна помощь в скрипте с заменой строк

Сообщение socr »

diesel писал(а):
21.10.2008 15:35

Код: Выделить всё

#!/bin/sh

while read i; do
    if [ "$i" = "$2" ]; then
        echo $3
    else
        echo $i;
    fi
done < $1

первый аргумент - файл
второй аргумент - строка которую заменять
третий аргумент - строка на которую заменять

_только_ /bin/sh regexp'ы для строк будет очень сложно сделать.

мне надо менять только ту строку, в которой есть определённое слово
Простите сделать что???
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Нужна помощь в скрипте с заменой строк

Сообщение diesel »

Код: Выделить всё

#!/bin/sh

while read i; do
    ups="0"

    for k in $i; do
        if [ "$k" = "$2" ]; then
            ups="1"
        fi
    done

    if [ "$ups" = 1 ]; then
        echo $3;
    else
        echo "$i";
    fi

done < $1


слово которое мы ищим задается во втором аргументе, строка на которую мы заменяем - в третьем.

Если надо заменить конкретное слово(в конце строк будут лишние пробелы, да и вообще немного стрёмный вариант):

Код: Выделить всё

#!/bin/sh

while read i; do
    for k in $i; do
        if [ "$k" = "$2" ]; then
            echo -ne  "$3 "
        else
            echo -ne "$k ";
        fi
    done
    echo ""
done < $1
Спасибо сказали:
socr
Сообщения: 35
ОС: Ubuntu Linux

Re: Нужна помощь в скрипте с заменой строк

Сообщение socr »

diesel писал(а):
21.10.2008 15:56

Код: Выделить всё

#!/bin/sh

while read i; do
    ups="0"

    for k in $i; do
        if [ "$k" = "$2" ]; then
            ups="1"
        fi
    done

    if [ "$ups" = 1 ]; then
        echo $3;
    else
        echo "$i";
    fi

done < $1


слово которое мы ищим задается во втором аргументе, строка на которую мы заменяем - в третьем.

Если надо заменить конкретное слово(в конце строк будут лишние пробелы, да и вообще немного стрёмный вариант):

Код: Выделить всё

#!/bin/sh

while read i; do
    for k in $i; do
        if [ "$k" = "$2" ]; then
            echo -ne  "$3 "
        else
            echo -ne "$k ";
        fi
    done
    echo ""
done < $1


да нет, надо заменит целую строку в котором есть нужное слово.
как я понимаю это выглиадит так
while read i; do
if [ "$i" = "$2" ]; then
echo $3
else
echo $i;
fi
done < $1
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Нужна помощь в скрипте с заменой строк

Сообщение diesel »

socr писал(а):
21.10.2008 16:09
да нет, надо заменит целую строку в котором есть нужное слово.
как я понимаю это выглиадит так
while read i; do
if [ "$i" = "$2" ]; then
echo $3
else
echo $i;
fi
done < $1

не так, выше вариант есть который заменяет строку если в ней есть нужное слово.
Спасибо сказали:
socr
Сообщения: 35
ОС: Ubuntu Linux

Re: Нужна помощь в скрипте с заменой строк

Сообщение socr »

diesel писал(а):
21.10.2008 16:28
socr писал(а):
21.10.2008 16:09
да нет, надо заменит целую строку в котором есть нужное слово.
как я понимаю это выглиадит так
while read i; do
if [ "$i" = "$2" ]; then
echo $3
else
echo $i;
fi
done < $1

не так, выше вариант есть который заменяет строку если в ней есть нужное слово.

если вы про этот скрипт
#!/bin/sh

while read i; do
ups="0"

for k in $i; do
if [ "$k" = "$2" ]; then
ups="1"
fi
done

if [ "$ups" = 1 ]; then
echo $3;
else
echo "$i";
fi

done < $1

большое спасибо, но одна проблека, он выводит в стд аыт, а нужно заменить в файле
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Нужна помощь в скрипте с заменой строк

Сообщение diesel »

socr писал(а):
21.10.2008 16:40
большое спасибо, но одна проблека, он выводит в стд аыт, а нужно заменить в файле

над этим предлагаю подумать самостоятельно :) нужно сохранить вывод в файл, а потом файл скопировать на место того который был.
Спасибо сказали:
socr
Сообщения: 35
ОС: Ubuntu Linux

Re: Нужна помощь в скрипте с заменой строк

Сообщение socr »

diesel писал(а):
21.10.2008 17:47
socr писал(а):
21.10.2008 16:40
большое спасибо, но одна проблека, он выводит в стд аыт, а нужно заменить в файле

над этим предлагаю подумать самостоятельно :) нужно сохранить вывод в файл, а потом файл скопировать на место того который был.

Diesel огромное спасибо, всё сделал... Правда пришлось делат через временный фаил.. :rolleyes:
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Нужна помощь в скрипте с заменой строк

Сообщение Folderx »

такую ещё попробуй, работа со строками

replace.sh

Код: Выделить всё

#!/bin/sh

ARGS=3;
FILE="$1";
WORD="$2";
REPLACEMENT="$3";
NLINES=0;
LINE=;
NREP=0;

if [ ! $# -eq $ARGS ]; then
    echo "Usage: $0 file word replacement";
    exit 1;
fi;

NLINES="$(cat "$FILE" | wc -l)";
exec 3<$FILE;
while [ $NLINES -ge 0 ]; do
    LINE="$(head -1 0<&3)";
    if ! echo "$LINE" | grep "$WORD" >/dev/null; then
        echo "$LINE";
    else
        echo "$REPLACEMENT";
        let NREP++;
    fi;
    let NLINES--;
done;
exec 3<&-;

if [ ! $NREP -gt 0 ]; then
    exit 1;
fi;

exit 0;
Спасибо сказали:
socr
Сообщения: 35
ОС: Ubuntu Linux

Re: Нужна помощь в скрипте с заменой строк

Сообщение socr »

С sed это сделал. Но вопрос, а возможно ли сделать замену строк с помощью sed, но без временного файла?
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Нужна помощь в скрипте с заменой строк

Сообщение uptime »

socr писал(а):
07.11.2008 13:41
С sed это сделал. Но вопрос, а возможно ли сделать замену строк с помощью sed, но без временного файла?


нельзя. Как только вы начнёте писАть в файл, это будет уже новый файл. Т.е. вы потеряете содержимое старого. А чем плох временный файл?
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
socr
Сообщения: 35
ОС: Ubuntu Linux

Re: Нужна помощь в скрипте с заменой строк

Сообщение socr »

Нет, ну просто интересно :)
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Нужна помощь в скрипте с заменой строк

Сообщение uptime »

В принципе есть методы прямого доступа к файлу. Это нужно для работы с бинарными данными большого объёма. И файл, насколько я помню, должен быть фиксированного размера, т.е. для замены строк это не подходит. Кроме того, сомневаюсь, чтобы были привязки этих методов к скриптовым языкам.
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
Аватара пользователя
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo

Re: Нужна помощь в скрипте с заменой строк

Сообщение broom »

socr писал(а):
07.11.2008 13:41
С sed это сделал. Но вопрос, а возможно ли сделать замену строк с помощью sed, но без временного файла?

Можно, sed -i.
but in the darkness, behind your smile, you scream... © Dio
Спасибо сказали:
Mellon
Сообщения: 655
Статус: Powered by Gentoo
ОС: Gentoo

Re: Нужна помощь в скрипте с заменой строк

Сообщение Mellon »

Кто-то тут яано врёт ;)
man sed:

Код: Выделить всё

-i[SUFFIX], --in-place[=SUFFIX]

              edit files in place (makes backup if extension supplied)


О, broom, малаца, одновременно почти:)
Некоммерческий файлообмен не может сравниваться с кражей, так как кража лишает кого-то возможности использовать украденный объект. ©
--------------------
Переворачиватель пингвинов
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Нужна помощь в скрипте с заменой строк

Сообщение uptime »

Mellon писал(а):
07.11.2008 14:48
Кто-то тут яано врёт ;)
man sed:

Код: Выделить всё

-i[SUFFIX], --in-place[=SUFFIX]

               edit files in place (makes backup if extension supplied)


О, broom, малаца, одновременно почти :)

Не совсем )). Специально проэкспериментировал на большом файле. sed сам создаёт временный файл.
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
Аватара пользователя
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo

Re: Нужна помощь в скрипте с заменой строк

Сообщение broom »

uptime писал(а):
07.11.2008 15:24
Не совсем )). Специально проэкспериментировал на большом файле. sed сам создаёт временный файл.

Да, но это уже головная боль sed'а. :)
but in the darkness, behind your smile, you scream... © Dio
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Нужна помощь в скрипте с заменой строк

Сообщение diesel »

socr писал(а):
07.11.2008 13:41
С sed это сделал. Но вопрос, а возможно ли сделать замену строк с помощью sed, но без временного файла?

возможности использовать sed, кстати в первоначальном условии не было (:
еще, замечу, что sed -i работает не везде(не везде где есть /bin/sh), sed -i все-равно использует временный файл, поэтому на тот файл который вы таким образом редактируете хозяином становится текущий пользователь, что может быть не очень нужно.
Спасибо сказали: