sed не может выполнять преобразование даты; вместо этого я бы рекомендовал вам использовать более подходящий инструмент, такой как awk:
echo '<StartTime>1292435633</StartTime>' | awk '{
match($0,/[0-9]+/);
t = strftime("%F %T",substr($0,RSTART,RLENGTH),1);
sub(/[0-9]+/,t)
}
{print}'
Если ваши входные файлы имеют один тег на строку, как в примере с вашей структурой, он должен работать без сбоев.
Если вам нужно повторить операцию для каждого файла .txt, просто используйте оболочку для:
for file in *.txt; do
awk '/^<[^>]*Time>/{
match($0,/[0-9]+/);
t = strftime("%F %T",substr($0,RSTART,RLENGTH),1);
sub(/[0-9]+/,t)
} 1' "$file" >"$file.new"
# mv "$file.new" "$file"
done
По сравнению с предыдущим кодом я сделал два небольших изменения:
- добавлено условие / ^ <[^>] * Время> /, которое проверяет, начинается ли текущая строка с или
- преобразовано {print} в более короткое '1'
Если файлы, заканчивающиеся на .new, содержат ожидаемый результат, вы можете раскомментировать строку, содержащую mv.