[SunOs,командная строка] Как сделать замену в нескольких файлах?

Papazyan

Знаю как создать поток имен файлов (find) и как выполнить команду (тем же find или в xargs передать) и как сделать замену (sed но как сохранить результат в тот же файл? У sed есть какая-то мутная команда w, но как ею сохранить неясно. Может можно в xargs как-нибудь output перенаправить типа xargs -i sed -e "blablabla" {} > {}?

AlexV769

sed -i

Papazyan

У моего sed нет такой опции - кошерная SunOS 5.10.

AlexV769

gsed
?

klyv

ed?

Papazyan

У меня СанОс, там нет гнутых утилит.
На ed может и можно, но как? Вопрос-то в том, как это одной строкой сделать, иначе можно скрипт написать и в нем легко перенаправить вывод sed'a.

vall

а негнутый perl есть?

conv3rsje

как это одной строкой сделать
через mktemp и субшелл
но проще скрипт написать или гнутый сед поставить

Serab

типа xargs -i sed -e "blablabla" {} > {}?
Вот так очень-очень не советую =)

klyv

как это одной строкой сделать
echo ",s/what/with/g\
w smth.txt" | ed smth.txt
строчек 2, но команда одна :)
(заменяет все вхождения слова what на with)
PS: sed - stream editor, для обработки потоков, не файлов.

conv3rsje

echo ",s/what/with/g\
w smth.txt"

если чо
printf ",s/what/with/g\nw smth.txt\n"

можно и в одну :)

klyv

в конце перевода строки не надо - лишние вопросы будут.
твой вариант длиннее на 3 символа, т.е. почти на 10% :p
хотя он более соответствует однострочковости команды - вдруг вводим через дыру в php-страничке, в которой перевод строки может не поняться :)

klyv

а, да, ещё одын PPS - если файлы большие, надо делать sed'ом во временный файл, который потом переименовывать в оригинальный. ибо ed грузить весь входдной файл в память

conv3rsje

Вроде на 5? :) (tf+\n+\n - 0x0a) = 5
Но вроде printf считается более кошерным способом скармливания такого барахла прогам.
Кстати лишних вопросов у меня не было, молча написал два числа и вышел
Но для этого можно наверно вместо w сделать wq

Serab

Ну так
 
sed -i -e 's/what/with/g' smth.txt  

Смысл выражения про то, что sed — не для файлов не понял, а точнее не согласен.
upd: да, если хочется короче, «-e» можно не писать.
upd: упс, увидел третий пост, прошу меня простить =)

pitrik2

У моего sed нет такой опции - кошерная SunOS 5.10.
поставь себе туда гнутый sed
правда такой вариант будет работать токо там где есть этот sed
т.е. это будет решение для одной машины
но зачастую именно оно и нужно
если есть рут то ставь
pkgadd sed-4.1.5-sol10-x86-local
пакет скачивай с: http://www.sunfreeware.com/indexintel10.html
если нет рута то
ща в альт линукс напишу инструкцию как что-либо поставить на соляру не имея рута
upd:

serega1604

>У моего sed нет такой опции - кошерная SunOS 5.10.
а самому реализовать такую функциональность не катит?
xargs -i bash -c 'sed "s/qwe/asd/g" "{}" > "{}".tmp; mv "{}".tmp "{}" '

Ёма народ! Я чувствую изменения в своём коде и лечу!

Serab

ну так тут и идет битва за самую короткую реализацию =)

Papazyan

поставь себе туда гнутый sed
спасибо, конечно, за инструкцию, но в этом случае проще скрипт написать, чем специальный сед устанавливать.
Оставить комментарий
Имя или ник:
Комментарий: