URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7195
[ Назад ]

Исходное сообщение
"Sed затирает файлы,прошу помощи!!!!"

Отправлено bayer , 20-Фев-08 13:17 
Исходные данные:
есть огромное количество практически идентичных файлов с именем "mask" разбросаных по всей всем каталогам пользователей.
Файл примерно следущего содерджания:
Allow from 1 2 3
Allow from sam liza
......
Нужно либо добавить строчку между этими двумя,либо добавить значение в одну из строк,например Allow from 1 2 3 4

Как я пытался это сделать:
for i in ` find /home -name "mask" `
do
cat $i | sed -e 's/Allow from 1 2 3/Allow from 1 2 3 4/g' > $i
done

Результат примерно 60 %  файлов обрабатывается корректно,остальные просто становяться пустыми.(((
Прошу помощи,укажите что не правильно в скрипте,либо предложите свой вариант решения...


Содержание

Сообщения в этом обсуждении
"Sed затирает файлы,прошу помощи!!!!"
Отправлено angra , 20-Фев-08 13:31 
Во-первых, всегда берите переменные с именами файлов в кавычки, это избавит от проблем с файлами имеющими в себе пробелы. Во-вторых, избегайте чтения и записи файла в одной пайпе, именно это и приводит к затиранию, так как файл может сначала быть открыт на запись (а значит обнулен) и только потом с него будут пытаться читать.

Таким образом переписываем:
сat $i | sed -e 's/Allow from 1 2 3/Allow from 1 2 3 4/g' > $i
на
sed -ibak -e 's/Allow from 1 2 3/Allow from 1 2 3 4/g' "$i"
опция -i заставляет sed редактировать файл, если после -i указан суффикс(в данном случае bak), то он делает бэкап копию с добавлением этого суффикса к имени.


"Sed затирает файлы,прошу помощи!!!!"
Отправлено idle , 21-Фев-08 12:05 
>[оверквотинг удален]
>обнулен) и только потом с него будут пытаться читать.
>
>Таким образом переписываем:
>сat $i | sed -e 's/Allow from 1 2 3/Allow from 1 2 3 4/g' > $i
>на
>sed -ibak -e 's/Allow from 1 2 3/Allow from 1 2 3
>4/g' "$i"
>опция -i заставляет sed редактировать файл, если после -i указан суффикс(в данном
>случае bak), то он делает бэкап копию с добавлением этого суффикса
>к имени.

Только не забывайте, что опция -i - are non-standard FreeBSD extensions and may not be available on other operating systems. К сожалению.



"файлы,прошу"
Отправлено Andrey Mitrofanov , 21-Фев-08 12:23 
>>опция -i заставляет sed редактировать файл, если после -i указан суффикс(в данном
>>случае bak), то он делает бэкап копию с добавлением этого суффикса
>Только не забывайте, что опция -i - are non-standard FreeBSD extensions and
>may not be available on other operating systems. К сожалению.

$ sed --version
GNU sed версия 4.1.5
[...]
$ sed --help
[...]
  -i[СУФФИКС], --in-place[=СУФФИКС]
                 редактирование файлов на месте (создает копию, если указано расширение)

[...]

И ничего про FreeBSD... В `info sed` тоже. Есть в GNU -- Ж)
вполне себе "стандарт", хотя бы с какой-то точкт зрения.


"Sed затирает файлы,прошу помощи!!!!"
Отправлено L0n3R4ng3r , 21-Фев-08 17:50 
>[оверквотинг удален]
>строк,например Allow from 1 2 3 4
>
>Как я пытался это сделать:
>for i in ` find /home -name "mask" `
>do
>cat $i | sed -e 's/Allow from 1 2 3/Allow from 1 2 3 4/g' > $i
>done
>
>Результат примерно 60 %  файлов обрабатывается корректно,остальные просто становяться пустыми.(((
>Прошу помощи,укажите что не правильно в скрипте,либо предложите свой вариант решения...

Как вариант:

for i in ` find /home -name "mask" `
do
cat $i | sed -e 's/Allow from 1 2 3/Allow from 1 2 3 4/g' > $i.bak
mv $i.bak $i
done