LinuxForum.Fans
Тема

Замена слова на переменную.

Автор: vovanvster 8 сообщений 3791 просмотров
#332030

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

text

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

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

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

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

#332040

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

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

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

text
#!/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

#332047

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

text
/\".*\"/

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

#332049
"vovanvster⇓" написал:
надо ставить точку ?

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

"vovanvster⇓" написал:
И зачем нужно "g" ? Я думал это означает "глобально".

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

#332050

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

#332052

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

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

#332054
"vovanvster⇓" написал:
А просто * без точки не достаточна ?
"Lupo Alberto⇓" написал:
.* — один символ или любое их количество;

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

#332058

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

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

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

Войдите или зарегистрируйтесь, чтобы ответить.