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

Исходное сообщение
"sed и файлы."

Отправлено fire002 , 18-Июн-13 18:21 
Приветствую. Подскажите как лучше реализовать такую схему:
Есть директории, 1, 2, 3 и т.д с файлами list.txt в каждой директории, с содержимым в столбик.
dsadf
dfhdsdf
addgfgd
и т.д.

Необходимо sed'om заменить определенные строки, в файлах, где есть определенная строка (в любом месте файла, а не в определенной строке.)
sed '/baz/s/foo/bar/g'  -- действует только на строку.
Спасибо.


Содержание

Сообщения в этом обсуждении
"sed и файлы."
Отправлено михалыч , 18-Июн-13 20:56 
>[оверквотинг удален]
> Есть директории, 1, 2, 3 и т.д с файлами list.txt в каждой
> директории, с содержимым в столбик.
> dsadf
> dfhdsdf
> addgfgd
> и т.д.
> Необходимо sed'om заменить определенные строки, в файлах, где есть определенная строка
> (в любом месте файла, а не в определенной строке.)
> sed '/baz/s/foo/bar/g'  -- действует только на строку.
> Спасибо.

Так а разве модификатор g не говорит о том, что замена глобальная, во всех строках?


"sed и файлы."
Отправлено fire002 , 18-Июн-13 21:07 
>[оверквотинг удален]
>> dsadf
>> dfhdsdf
>> addgfgd
>> и т.д.
>> Необходимо sed'om заменить определенные строки, в файлах, где есть определенная строка
>> (в любом месте файла, а не в определенной строке.)
>> sed '/baz/s/foo/bar/g'  -- действует только на строку.
>> Спасибо.
> Так а разве модификатор g не говорит о том, что замена глобальная,
> во всех строках?

Мне не нужно заменять во всех строках.
Суть в том, что если в файле есть строка, допустим
baz
То необходимо будет заменить строку
foo на bar
А если в файле нет упоминания про baz, не делать никаких замен.


"sed и файлы."
Отправлено pavlinux , 19-Июн-13 00:14 
>>[оверквотинг удален]

find . -name list.txt -exec sed -e '/baz/s/foo/bar/g' -i {} \;


"sed и файлы."
Отправлено михалыч , 19-Июн-13 06:24 
>[оверквотинг удален]
>>> sed '/baz/s/foo/bar/g'  -- действует только на строку.
>>> Спасибо.
>> Так а разве модификатор g не говорит о том, что замена глобальная,
>> во всех строках?
> Мне не нужно заменять во всех строках.
> Суть в том, что если в файле есть строка, допустим
> baz
> То необходимо будет заменить строку
> foo на bar
> А если в файле нет упоминания про baz, не делать никаких замен.

sed 's/foo/bar/g' `grep -x -l baz *`


"sed и файлы."
Отправлено михалыч , 30-Июл-13 21:11 
>[оверквотинг удален]
>>>> Спасибо.
>>> Так а разве модификатор g не говорит о том, что замена глобальная,
>>> во всех строках?
>> Мне не нужно заменять во всех строках.
>> Суть в том, что если в файле есть строка, допустим
>> baz
>> То необходимо будет заменить строку
>> foo на bar
>> А если в файле нет упоминания про baz, не делать никаких замен.
> sed 's/foo/bar/g' `grep -x -l baz *`

Вот так правильно
sed -i '' 's/foo/bar/g' `grep -l baz basedir/*/*`


"sed и файлы."
Отправлено Andrey Mitrofanov , 19-Июн-13 09:42 
>[оверквотинг удален]
> Есть директории, 1, 2, 3 и т.д с файлами list.txt в каждой
> директории, с содержимым в столбик.
> dsadf
> dfhdsdf
> addgfgd
> и т.д.
> Необходимо sed'om заменить определенные строки, в файлах, где есть определенная строка
> (в любом месте файла, а не в определенной строке.)
> sed '/baz/s/foo/bar/g'  -- действует только на строку.
> Спасибо.

find basedir/ -type f -name list.txt|xargs -r grep -l "baz"|xargs -r sed -i 's/foo/bar/g'


"sed и файлы."
Отправлено LU , 30-Июл-13 21:49 
Брр. Строка в строке. Может, вы имели ввиду "..где есть определённое слово"?