The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  вход/выход  слежка  RSS
"sed замена строки в файле(по подстроке)"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"sed замена строки в файле(по подстроке)"  +/
Сообщение от eugene (??) on 22-Апр-11, 07:22 
Здравствуйте. Необходимо с помощью sed и/или awk заменить все строки в файле содержащие подстроку, например есть файл:
hello=123
asdfsdfsdfsdf
sdfsdf
klk lksd isdfritj nm
hello=56
sdf
sdfklksdflksd
hello=678
sdnfhfgh dfrtllk

Нужно заменить все строки имеющие подстроку "hello=чтото там" на строку hello=1000
Заранее благодарен.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "sed замена строки в файле(по подстроке)"  +/
Сообщение от Frodo on 22-Апр-11, 11:54 
sed -r 's/hello=чтото там/hello=1000/g' in.file  > out.file

>[оверквотинг удален]
> asdfsdfsdfsdf
> sdfsdf
> klk lksd isdfritj nm
> hello=56
> sdf
> sdfklksdflksd
> hello=678
> sdnfhfgh dfrtllk
> Нужно заменить все строки имеющие подстроку "hello=чтото там" на строку hello=1000
> Заранее благодарен.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "sed замена строки в файле(по подстроке)"  +/
Сообщение от eugene (??) on 22-Апр-11, 12:00 
> sed -r 's/hello=чтото там/hello=1000/g' in.file  > out.file

Ксожалению "чтото там" может быть любой последовательностью символов, вот в чем вся беда...

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "sed замена строки в файле(по подстроке)"  +/
Сообщение от eugene (??) on 22-Апр-11, 12:01 
>> sed -r 's/hello=чтото там/hello=1000/g' in.file  > out.file

Поэтому это немножко не то...

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "sed замена строки в файле(по подстроке)"  –1 +/
Сообщение от LSTemp (ok) on 22-Апр-11, 12:02 
>[оверквотинг удален]
> asdfsdfsdfsdf
> sdfsdf
> klk lksd isdfritj nm
> hello=56
> sdf
> sdfklksdflksd
> hello=678
> sdnfhfgh dfrtllk
> Нужно заменить все строки имеющие подстроку "hello=чтото там" на строку hello=1000
> Заранее благодарен.

cat $file|sed 's/hello=.*/hello=1000/'

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "sed замена строки в файле(по подстроке)"  +/
Сообщение от asser on 22-Апр-11, 12:09 
таки
cat $file|sed 's/^hello=.*/hello=1000/'


Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "sed замена строки в файле(по подстроке)"  +/
Сообщение от asser on 22-Апр-11, 12:12 
и даже
cat $file | sed 's/^hello=.*/hello=1000/g' > $newfile


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "sed замена строки в файле(по подстроке)"  +/
Сообщение от eugene (??) on 22-Апр-11, 12:34 
Спасибо вам огромное!
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "sed замена строки в файле(по подстроке)"  +/
Сообщение от pilot.netgmail.com on 22-Апр-11, 13:36 
> и даже
> cat $file | sed 's/^hello=.*/hello=1000/g' > $newfile

Примерно тоже, как сделать ?
если не найдено то "hello=1000" вставить в конец файла ?

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

11. "sed замена строки в файле(по подстроке)"  +/
Сообщение от LSTemp (ok) on 22-Апр-11, 14:53 
>> и даже
>> cat $file | sed 's/^hello=.*/hello=1000/g' > $newfile
> Примерно тоже, как сделать ?
> если не найдено то "hello=1000" вставить в конец файла ?

с=`cat file|grep -c 'hello=1000'`
[ $c -eq 0 ] && echo 'hello=1000' >> $file

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "sed замена строки в файле(по подстроке)"  +/
Сообщение от LSTemp (ok) on 22-Апр-11, 14:49 
> и даже
> cat $file | sed 's/^hello=.*/hello=1000/g' > $newfile

и даже поучить регулярные выражения. и man на команды почитать. мне вот интерестно нахрена в условиях поставленной тобой задачи еще /g использовать?

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

9. "sed замена строки в файле(по подстроке)"  –2 +/
Сообщение от sany (ok) on 22-Апр-11, 13:54 
то что ты спрашиваешь, называется "регулярные выражения"
каждый программист должен иметь хотя бы начальный уровень работы с ними.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

12. "sed замена строки в файле(по подстроке)"  +/
Сообщение от oklas (ok) on 26-Окт-13, 23:57 
Доброго дня всем.

  Мне понадобилось решение подобной задачи, после некоторого поиска я не нашел решения которое бы устраивало меня полностью. В частности наиболее подходящее решение приведено здесь, но его недостаток двойной проход чтения файла, а нужно изменить или добавить разумеется за один проход. В частности потому что в этом же проходе выполняются другие операции с текстом. Я решил что надо получше разобраться с sed, но он оказался очень капризным, в части выполнения команд, когда они передаются прям в командной строке а не в файле, причем ошибок не пишется просто работает не как ожидается.
  Я воспользовался случаем задать вопрос Евгению Степанищеву. ( как Вы знаете автор игры Шахматы написанные на sed ) По его слова эта тривиальная задача решается так:

s/^\(hello=\).*/\11000/g
t
$ a\
hello=1000

и запуск:

sed -f replace.sed входной_файл

Спасибо Евгению за решение.
Надо сказать что я был абсолютно близок к решению, но не получил его, из-за капризностей правильнее сказать или тонкостей работы с командами sed передаваемые в командной строке, так как я не пытался создать файл и писать в нем нечто подобное, а делалал все в командной строке. Предложенное решение хотя и работало, но мне нужно именно в командной строке (без файла программы). Привести к требуемому виду, удалось не сразу, собственно первое время было примерно тоже самое что и сначала, то метки не замечались sed'ом переходы не выполнялись и прочее, что все обусловлено рядом тонкостей, в частности необходимо разбивать на несколько команд наборов (ключ -e) по меньшей мере из-за меток, новая строка в команде 'a', экранирование символов, предварительная обработка значений , содержащих '/', так: sed 's#/#\\\\/#g' и похоже это еще не всё.
Полный вариант решения, на основе приведенного выше и с учетом того что было мне необходимо, в частности один проход и размещение в sh файле у меня получилось такое:

   sed -e "s/^$varname=.*/$varname=\"$value\"/g" \
      -e '/^'$varname'.*/,$b' -e "\$ a \\
$varname=\"$value\""

Соответственно если упростить до исходной задачи, то примерно так:

   sed -e "s/^hello=.*/hello=1000/g" \
      -e '/^hello.*/,$b' -e "\$ a \\
hello=1000"

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

13. "sed замена строки в файле(по подстроке)"  +/
Сообщение от SnowPraha on 21-Окт-16, 23:23 
В одну строку без заморочек, привет Евгению Степанищеву
sed -i 's/^Hello=.*/Hello=1000/g' filename
Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

14. "sed замена строки в файле(по подстроке)"  +/
Сообщение от oklas (ok) on 22-Окт-16, 09:44 
> В одну строку без заморочек, привет Евгению Степанищеву
> sed -i 's/^Hello=.*/Hello=1000/g' filename

Вы не дочитали форум, отвечаете только на исходное сообщение, на него ответ уже дан в самом начале. Ваш пример тривиальная замена, она не добавит в файл переменную "hello" если до этого она не была определена, и не позволяет делать другие (не sed) обработки файла за один и тот же проход чтения-записи.

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру