@ksvdon

Как сделать замену подстроки в bash?

Написал скрипт для пересчета времени. Читаю в цикле файл. Если строка начинается по шаблону дата/время - беру эту дату/время перевожу в юникс-время (секунды), добавляю нужную разницу в секундах, перевожу опять в формат дата/время и седом заменяю старое значение на новое. Но есть проблема. Если в тексте несколько одинаковых подстрок со временем, то замена пройдет не только в обрабатываемой в цикле подстроке, а везде, что в итоге влияет на результат... Как обработать только конкретную подстроку в цикле?

for myI in ./EX_FILE
    do
    co1=0
	while read line
        do
	    case $line in
	        ????-??-?????:??:*)
	        line=`echo "$line" | awk '{print $1 " " $2}'`
	        date_line_f[$co1]=$line
	        line=`date --date="$line" +%s`
	        let line=$line+$date_dif
	        line=`date --date=@$line +"%F %H:%M:%S"`
	        date_line_s[$co1]=$line
	        sed -i "s#${date_line_f[$co1]}#${date_line_s[$co1]}#" ./$myI - эта строка явно не годиться!!! Чем заменить перезапись старых данных но новые? Что бы замена шла не по всему тексту сразу, а конкретно в обрабатываемой подстроке!
	    esac
        let co1=$co1+1
        done <./$myI
    done
  • Вопрос задан
  • 2312 просмотров
Пригласить эксперта
Ответы на вопрос 1
IlyaEvseev
@IlyaEvseev
Opensource geek
Примерно так:
for f in "$@" ; do
    while read a b; do
        case "$a" in
            ????-??-?????:??:*) a="$(date --date="$DATE_DIFF seconds $a" "+%F %H:%M:%S")" ;;
        esac
        echo $a $b
    done < "$f" > "$f.new"
    if diff -q "$f" "$f.new" >/dev/null
        then rm "$f.new"
        else mv "$f.new" "$f"
    fi
done
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы