1 (10.08.2013 16:53:19 отредактировано vovanvster)

Здравствуйте.
Хочу написать скрипт для редактирования конфигурационного файла. Надо в строке под определённым номером заменить слово между кавычками "" на другое слово которое берётся из переменной вводимой пользователем.
Например:

frtkljhvlv
sykcghjkcgh "petr@google.com"
sdjgft "pass" dykihjk,
dfgjcvhkvjk

Не могу сообразить команду sed которая будет это делать.
Кажется так должно выглядеть:

sed -e "s номер_строки/то_что_между_кавычками/$variable/" file

И можно ли это исполнить только средствами bash ?
Конечно если будет проще.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

2

Если средствами sed то можно так:

sed -e "3s/\".*\"/\"NEW_WORD\"/g" -i test.txt

Если средствами bash то можно так:

#!/bin/bash

NEW=\"NEW_WORD\" #новое слово
NUM=3 #номер искомой строки
i=0 # индекс строки
#Функция поиска и замены слова
F_FILE(){
cat test2.txt|while read file 
do
i=$(($i+1))
if [ "$i" -eq "$NUM" ];  then
file=${file//\"*\"/$NEW} 
fi
cat <<<$file  
done 
}

F_FILE >test2.txt.dump
mv test2.txt.dump test2.txt

3 (10.08.2013 19:02:19 отредактировано vovanvster)

Большое спасибо, средствами sed конечно красивее. Вы не могли бы объяснить почему в выражении

/\".*\"/

надо ставить точку ? И зачем нужно "g" ? Я думал это означает "глобально".
То есть действие будет проводиться над всем файлом а не только над одной строкой.
Ещё раз большое спасибо.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

4 (10.08.2013 18:37:10 отредактировано Lupo Alberto)

vovanvster⇓ пишет:

надо ставить точку ?

.* — один символ или любое их количество;

vovanvster⇓ пишет:

И зачем нужно "g" ? Я думал это означает "глобально".

g — искать все совпадения в строке.

Был, был и весь вышел...

5

А просто * без точки не достаточна ?

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.

6

Точка нужна что бы работала звездочка )
g нужен если в строке меняется несколько слов заключенных в кавычки, иначе этот параметр не обязателен.

Скрипт что средствами bash можно использовать только если не существенен формат файла, так как команда read обрезает пробелы в начале и в конце строки.

7 (10.08.2013 18:51:18 отредактировано Lupo Alberto)

vovanvster⇓ пишет:

А просто * без точки не достаточна ?

Lupo Alberto⇓ пишет:

.* — один символ или любое их количество;

точнее, не менее одного символа должно быть. Только * включает и ноль символов.

Был, был и весь вышел...

8 (10.08.2013 19:58:19 отредактировано vovanvster)

Ясно, значит в моём случае действительно и "g" и "." не нужны.

__ Добавил через пол часа: А ничего подобного, отсутствие этих символов приводит к непредсказуемым результатам.

Вроде всё работает, спасибо всем за помошь. Не знаю как тему закрыть.

3.2.7. Запрещено оскорблять участников и отвечать на оскорбления в любой форме — прямой, косвенной или заочной.