- Код: Выделить всё
find . -maxdepth 1 -name "*" -type f -print | xargs sed -i /SOA/s/serv1/serv2/
или даже ещё проще:
- Код: Выделить всё
sed -i /SOA/s/serv1/serv2/ *
Но есть система (OpenBSD), на которой sed не понимает ключа '-i' (in place). Решение с выводом во временные файлы с последующим переименованим выглядит неудобным и громоздким. Попытался изобразить нечто такое:
- Код: Выделить всё
find . -name "*" -type f -print | xargs -I {} sh -c "sed /SOA/s/serv1/serv2/ {} | cat > {}"
В конце пришлось ставить именно | cat > {}, а не просто > {}. Сначала показалось, что нормально работает скрипт, но оказалось, что он обрезает размер выходного файлов до 32768 или до 49152 (32768+16384) байт (размеры меняются между этими двумя значениями от запуска к запуску). Видимо, это некий лимит внутреннего буфера pipe. Все файлы меньше указаного размера преобразуются без проблем 'in place'.
Кроме очевидного варианта с установкой GNU sed на OpenBSD (с сожалению, невозможно, по некоторым причинам), есть ли варианты, меняющие "на-лету" размеры буфера pipe? Или у меня просто глаз замылился и есть другие решения? Напомню, никаких внешних скриптов-файлов, всё должно уложиться в одну строку.