Нужна помощь в скрипте с заменой строк (Нужна помощь в скрипте с заменой строк)
Модератор: Модераторы разделов
-
socr
- Сообщения: 35
- ОС: Ubuntu Linux
Нужна помощь в скрипте с заменой строк
Добрый день, есть фаил, в котором находиться текст. Надо заменить строки текста в которых есть указанное слово, на произвольную цтрочку(подаётся как параметр). Использовать только /bin/sh возможности. Я тут подумал, поидее ход действий должен быть такой(ето как я его понимаю):
1. По строке считываем файл
2. Провериаем есть ли такое слово
3. Если есть заменяем на нужную строку и записываем в файл
4. Если нету, то оставлияем без изменениж
Может кто подскажет как ето в Никсах сделать???
1. По строке считываем файл
2. Провериаем есть ли такое слово
3. Если есть заменяем на нужную строку и записываем в файл
4. Если нету, то оставлияем без изменениж
Может кто подскажет как ето в Никсах сделать???
-
Luinnar
- Сообщения: 246
- ОС: Solaris, Debian, Ubuntu
Re: Нужна помощь в скрипте с заменой строк
Ваше ограничение (что можно только sh использовать) подразумевает отказ от таких стандартных средств, как sed и awk?
Если нет, то проще всего для замены использовать sed:
sed "s/$1/$2/g"
Однако учтите, что в $1 и $2 не должно быть обратных слэшей, либо можно использовать другой разделитель:
sed "s@$1@$2@g"
(в этом варианте нельзя символ @ в строках использовать).
-
socr
- Сообщения: 35
- ОС: Ubuntu Linux
Re: Нужна помощь в скрипте с заменой строк
да, подразумевается отказ от sed, awk, perl и т.д.
С sed я это сделал, надо как-то без него
С sed я это сделал, надо как-то без него
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Нужна помощь в скрипте с заменой строк
Код: Выделить всё
#!/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
-
socr
- Сообщения: 35
- ОС: Ubuntu Linux
Re: Нужна помощь в скрипте с заменой строк
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: Нужна помощь в скрипте с заменой строк
Код: Выделить всё
#!/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: Нужна помощь в скрипте с заменой строк
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
-
socr
- Сообщения: 35
- ОС: Ubuntu Linux
Re: Нужна помощь в скрипте с заменой строк
если вы про этот скрипт
#!/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
-
socr
- Сообщения: 35
- ОС: Ubuntu Linux
Re: Нужна помощь в скрипте с заменой строк
Diesel огромное спасибо, всё сделал... Правда пришлось делат через временный фаил..
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: Нужна помощь в скрипте с заменой строк
такую ещё попробуй, работа со строками
replace.sh
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: Нужна помощь в скрипте с заменой строк
С sed это сделал. Но вопрос, а возможно ли сделать замену строк с помощью sed, но без временного файла?
-
uptime
- Сообщения: 1661
- Статус: Drinker with computing problems
- ОС: kubuntu 8.04
Re: Нужна помощь в скрипте с заменой строк
нельзя. Как только вы начнёте писАть в файл, это будет уже новый файл. Т.е. вы потеряете содержимое старого. А чем плох временный файл?
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
The answer is blowin' in the wind.
-
socr
- Сообщения: 35
- ОС: Ubuntu Linux
Re: Нужна помощь в скрипте с заменой строк
Нет, ну просто интересно 
-
uptime
- Сообщения: 1661
- Статус: Drinker with computing problems
- ОС: kubuntu 8.04
Re: Нужна помощь в скрипте с заменой строк
В принципе есть методы прямого доступа к файлу. Это нужно для работы с бинарными данными большого объёма. И файл, насколько я помню, должен быть фиксированного размера, т.е. для замены строк это не подходит. Кроме того, сомневаюсь, чтобы были привязки этих методов к скриптовым языкам.
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
The answer is blowin' in the wind.
-
broom
- Бывший модератор
- Сообщения: 1629
- Статус: мизантроп.ка
- ОС: Gentoo
Re: Нужна помощь в скрипте с заменой строк
Можно, sed -i.
but in the darkness, behind your smile, you scream... © Dio
-
Mellon
- Сообщения: 655
- Статус: Powered by Gentoo
- ОС: Gentoo
Re: Нужна помощь в скрипте с заменой строк
Кто-то тут яано врёт 
man sed:
О, broom, малаца, одновременно почти
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: Нужна помощь в скрипте с заменой строк
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.
The answer is blowin' in the wind.
-
broom
- Бывший модератор
- Сообщения: 1629
- Статус: мизантроп.ка
- ОС: Gentoo
Re: Нужна помощь в скрипте с заменой строк
Да, но это уже головная боль sed'а.
but in the darkness, behind your smile, you scream... © Dio
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Нужна помощь в скрипте с заменой строк
возможности использовать sed, кстати в первоначальном условии не было (:
еще, замечу, что sed -i работает не везде(не везде где есть /bin/sh), sed -i все-равно использует временный файл, поэтому на тот файл который вы таким образом редактируете хозяином становится текущий пользователь, что может быть не очень нужно.