Исходные данные:
есть огромное количество практически идентичных файлов с именем "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 % файлов обрабатывается корректно,остальные просто становяться пустыми.(((
Прошу помощи,укажите что не правильно в скрипте,либо предложите свой вариант решения...
Во-первых, всегда берите переменные с именами файлов в кавычки, это избавит от проблем с файлами имеющими в себе пробелы. Во-вторых, избегайте чтения и записи файла в одной пайпе, именно это и приводит к затиранию, так как файл может сначала быть открыт на запись (а значит обнулен) и только потом с него будут пытаться читать.Таким образом переписываем:
с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), то он делает бэкап копию с добавлением этого суффикса к имени.
>[оверквотинг удален]
>обнулен) и только потом с него будут пытаться читать.
>
>Таким образом переписываем:
>с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. К сожалению.
>>опция -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 -- Ж)
вполне себе "стандарт", хотя бы с какой-то точкт зрения.
>[оверквотинг удален]
>строк,например 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