LINUX.ORG.RU

change word in file


0

1

привет всем
как можно написать скрипт которий такой текст

первая страка
вторая «string» строка
третяя строка

поменяет на

первая страка
вторая «changed» строка
третяя строка

тоесть поменяет только то что находится на второй строчке в ковычках

sed -i "s,\"string\",\"changed\"," filename
Deleted ()
Ответ на: комментарий от north88

man sed:

Commands which accept address ranges
<...>
s/regexp/replacement/
Attempt to match regexp against the pattern space. If successful, replace that portion matched with replacement. The replacement may contain the special character & to refer to that portion of the pattern space which matched, and the special escapes \1 through \9 to refer to the corresponding matching sub-expressions in the regexp.
<...>
Addresses
<...>
number Match only the specified line number.


Т.е. нам остаётся дать команде s/// (замена) интервал строк (просто 5).

Итого:

sed -i '5s/«string»/«replacement»/' filename

Если «string» или «replacement» содержат «/» или прочие спецсимволы, их нужно экранировать символом «\». Потренируйтесь «на кошках», без опции -i («edit files in place»), чтобы sed выводил результат на экран вместо редактирования файла.

AITap ★★★★★ ()
Ответ на: комментарий от AITap

и еше один вопрос и все
если я не знаю что в скобках но нужно изменить то что в скобках на строке 5 пердый стреченний только

north88 ()
Ответ на: комментарий от north88
% echo 'string1"string2"string3' | sed 's/\".*\"/\"test\"/'
string1"test"string3
zolden ★★★★★ ()
Ответ на: комментарий от north88

если я не знаю что в скобках но нужно изменить то что в скобках на строке 5 пердый стреченний только

Напишите регулярное выражение, которое подходит под такую ситуацию:
sed -ri '5s/«[^»]+«/„replace“/' filename
(заменить ненулевое количество символов, отличающихся от кавычки и находящихся в кавычках, на „replace“). Флаг -r нужен для поддержки extended regexp (символ +, означающий »>0 раз взять предыдущий символ", берётся оттуда).

AITap ★★★★★ ()
Ответ на: комментарий от AITap

и если нужно чтоб «replace» получался от например другои комманды, например туда писалось текушее време или дата

north88 ()
Ответ на: комментарий от north88

Воспользуйтесь функцией шелла для встраивания вывода команд в строки (попробуйте echo «my text $(команда)»)

AITap ★★★★★ ()
Ответ на: комментарий от north88

Очевидно,
«5s/\»[^\«]+\»/\«$(команда)\»/"

- заменяем одинарные кавычки на двойные, чтобы разрешить интерпретацию спецсимволов внутри строки
- экранируем все двойные кавычки, чтобы не прервавть строку
- добавляем $(команда) в нужное место

AITap ★★★★★ ()
Ответ на: комментарий от AITap

чтож вы так любите эскейпить до нечитаемости, сравните

"5s/\"[^\"]+\"/\"$(команда)\"/"
vs
'5s/"[^"]+"/"'$(команда)'"/'

anonymous ()
Ответ на: комментарий от anonymous

Тоже верно.
Совсем правильно тогда будет:
'5s/«[^»]+«/»'«$(команда)»'«/'

AITap ★★★★★ ()
Ответ на: комментарий от AITap

всем огромное спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!
все работает прекрасно!!!!!!!!!!

north88 ()

В общем случае помогает sed, но надо указать строку (можно попробовать автоматизировать через grep, если мне не изменяет память). Если нужно сделать по шаблону - awk удобнее.

Quasar ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.