LINUX.ORG.RU

Как\чем лучше пройтись заменой (с параметром) по куче файлов?


0

1

Есть стопицот *.xmp

В них есть строка

   crs:Exposure2012="+0.30"
(Значение почти везде разное. Мне нужно уменьшать на фиксированную величину.) Мне нужно пройтись по всем этим файлам и уменьшить это значение на заданную величину, например на 0.20.

Может кто носом ткнет в нужную скриптовалку? Манул правильный и конкретный. Можно и под онтопик, на впс поковыряю.



Последнее исправление: dk- (всего исправлений: 1)
Ответ на: комментарий от ziemin

Ага

[code]
<x:xmpmeta xmlns:x=«adobe:ns:meta/» x:xmptk=«Adobe XMP Core 5.5-c002 1.148022, 2012/07/15-18:06:45 »>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=«»
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
xmlns:exif="http://ns.adobe.com/exif/1.0/"
xmlns:aux="http://ns.adobe.com/exif/1.0/aux/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:crs="http://ns.adobe.com/camera-raw-settings/1.0/"
[/code]

Это файлы настроек от рав конвертора.

dk-
() автор топика
$ perl -pe's/crs:Exposure2012="\K([\d.+-]+)"/sprintf("%+1.2f\"",$1-0.40)/e'
 crs:Exposure2012="+0.30"
 crs:Exposure2012="-0.10"
 crs:Exposure2012="+0.90"
 crs:Exposure2012="+0.50"

Остаётся добавить -i.bak и имена файлов в качестве аргументов.

AITap ★★★★★
()

написать скрипт в 10 строк на любом языке

trashymichael ★★★
()
Ответ на: комментарий от blackst0ne

Ты думаешь я бы создавал эту тему умея сие?)

Вопроса задан в двух надеждах:
кто-то подскажет готовый софт это умеющий.
кто-то покажет где конкретно это понять и разобраться)

dk-
() автор топика

У меня в почте завалялся следующий рецепт:

Например, так:

$ find . -type f -exec sed --in-place 's/byaka/buka/g' \{\} \;

Здесь замена 'byaka' на 'buka' во всех файлах в текущей директории и ниже.

sin_a ★★★★★
()
Ответ на: комментарий от dk-

Вот скрипт на Ruby, требует гем nokigiri:

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'nokogiri'

def update_exposure(file, value)
  doc = Nokogiri::XML(File.open(file))
  elems = doc.xpath("//*[@crs:Exposure2012]", "crs" => "http://ns.adobe.com/camera-raw-settings/1.0/")
  elems.each do |elem|
    exposure = elem["crs:Exposure2012"].to_f
    exposure += value
    elem["crs:Exposure2012"] = sprintf "%+.2f", exposure
  end
  File.open(file, 'w') { |f| f.puts doc.to_xml }
end

if __FILE__ == $PROGRAM_NAME
  val = ARGV.shift.to_f
  ARGV.each do |f|
    print "Processing `#{f}'... "
    update_exposure(f, val)
    puts "done!"
  end
end

Логика там простая, так что перепишешь на свой любимый язык, если понадобится.

В качестве параметров скрипта передаётся значение, на которое нужно увеличить или уменьшить значение crs:Exposure2012, с опциональным знаком (т. е., если «0.5» или «+0.5» — увеличиваем на 0.5; если "-0.5" — уменьшаем).

Остальные параметры — имена файлов.

Скрипт перезаписывает текущие файлы, так что лучше делай бекап.

theNamelessOne ★★★★★
()

Средствами рав-конвертера это нельзя сделать? В лайтруме, например, есть копипастилка для настроек пост-процессинга.

provaton ★★★★★
()
Ответ на: комментарий от provaton

Пользуюсь ею вовсю. Но такое она не умеет.
Мне надо не всем равам одну экспокоррекцию. А каждую из разных экспокоррекций понизить\повысить на фиксированную величину.

dk-
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.