Замена строки в группе файлов

Автор: Mik_ Дата: 19.12.2009 22:51 Всем привет!
Прошу совета:
нарыл на форумах скрипт для замены строки по совпадению с помощью редактора sed
он, родимый делает перезапись, но как то непредсказуемо- из 15 файлов переписывает 6 как надо, а остальные становятся пустые.
Задача такая:
надо оповестить об изменениях в режиме тренировок коллектив из 15 человек по смс.
Для работы проги рассылки подготовлены файлы с номерами телефонов и текстом через строку.
Теперь, чтобы не лезть в каждый файл, захотелось делать изменения одним разом.
Вот скрипт:
---
#!/bin/sh
find /path -name [mask_files] > ./tempfile
while read LINE
do
cat $LINE | sed 's/^old_text/new_text/g' > $LINE
done < ./tempfile
rm ./tempfile
---
Так вот невозможно предсказать, в какие файлы внесет изменения - один раз 1,2,5,9,12 другой раз 4, 8, 6,11
свойства файлов одинаковые.
Обидно, да!
Спасибо заранее!

То, что сегодня звучит неубедительно, завтра может убедительно подействовать...
Re: замена строки в группе файлов 20.12.2009 00:39kosmonavt 1.
> он, родимый делает перезапись, но как то непредсказуемо- из 15 файлов переписывает 6 как надо, а остальные становятся

Ест-но. рассмотирм:

> cat $LINE | sed 's/^old_text/new_text/g' > $LINE

С чего вы зяли, что cat откроет файл (да еще целиком проглотит содержимое) до того как шелл откроет этот же файл и усечет его до нулевой длины?

> Так вот невозможно предсказать

Совершенно верно! Порядок открытия файлов в команде непредсказуем. Или запускайте sed с флагом "-i" и подсовывайте ему имя как аргумент без cat и перенаправления вывода, или делайте вывод во временный файл, а уже потом переместите временный файл на место старого.

2.
Если подстрока в выражении sed'а привязана к началу строки то флаг "g" не нужен. Либо уберите якорь начала строки ибо в противном случае будет выполнена только одна замена.

3.
В самом скрипте много лишних действий. Достаточно однострочника:
find /path -name [mask_files] -exec sed -i 's/^old_text/new_text/' {} +
Re: замена строки в группе файлов 20.12.2009 14:35Mik_ Большое спасибо за ответ.
Конечно, я не могу видеть приоритета обработки, потому что чтобы видеть - надо знать.
Этот скрипт я не сам писал, но он (как и ваш) продвинул меня немного к свету.
Буду дальше двигаться...

И еще:
>2. Если подстрока в выражении sed'а привязана к началу строки то флаг "g" не нужен. Либо уберите якорь начала строки ибо в противном случае будет выполнена только одна замена.

Замена одной строки в файле совпавшей с образцом или замена в одном файле и окончание поиска в других?
Куря маны по седу я понял, что только одну совпавшую строку в файле заменит.
Еще раз спасибо!

То, что сегодня звучит неубедительно, завтра может убедительно подействовать...
Re: замена строки в группе файлов 20.12.2009 14:57kosmonavt > Замена одной строки в файле совпавшей с образцом или замена в одном файле и окончание поиска в других?

Имелась в виду замена подстрок(и), совпавшей с образцом, в каждой строке файла.

> Куря маны по седу я понял, что только одну совпавшую строку в файле заменит.

Только для замены одной строки нужно использовать карман (hold), но проще воспользоваться awk

[ftp.linux.org.ua]
Re: замена строки в группе файлов 20.12.2009 22:37Mik_ Спасибо kosmonavt!
Работает чудесно просто!
Убеждаюсь на практике в силе проективного подхода перед процедурным! :-7

То, что сегодня звучит неубедительно, завтра может убедительно подействовать...
RSS-материал