Вы ввели нас в заблуждение своим собственным кодом, а не примерами ввода и вывода ...
Основываясь на входе и выходе, которые вы показали в комментариях, я считаю, что лучше использовать sed:
val='20190306'
sed -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/'"${val:0:4}-${val:4:2}-${val:6:2}"'/g' file
Или в этом случае эта работа тоже:
sed -e "s/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/${val:0:4}-${val:4:2}-${val:6:2}/g" file
Если вывод выглядит нормально, добавьте переключатель -i
(sed -i -e ...
), чтобы изменить файл на месте.
Если вы хотите использовать awk:
awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file
Но поскольку у вас нет GNU awk v4.1.0+
, вы не можете использовать -i inplace
для изменения на месте.
Вы можете попробовать:
awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file | tee file
Если он не работает, вам придется использовать временный файл, например:
awk -v newd="${val:0:4}-${val:4:2}-${val:6:2}" '{gsub(/[0-9]{4}(-[0-9]{2}){2}/, newd);}1' file > temp_file
mv -f temp_file file