![найти и заменить значение в строке текста](https://rvso.com/image/36014/%D0%BD%D0%B0%D0%B9%D1%82%D0%B8%20%D0%B8%20%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0.png)
У меня есть текстовый файл, содержащий только одну строку текста.
1314:Battery:1.90:50:30
Я пытаюсь выяснить, можно ли как-то grep
изменить sed
значения 50 и 30 на следующие
1314:Battery:1.90:45:35
я бы уменьшил 50 на 5 и увеличил 5 с 30.
Пожалуйста, подскажите, есть ли лучший способ решить эту проблему? Я только начал изучать этот скриптинг. Спасибо =)
решение1
awk -F":" '{OFS=":"; print $1,$2,$3,$4-5,$5+5}' filename
Выход:
1314:Батарея:1.90:45:35
решение2
С perl
:
perl -i -F: -lape '$F[3]-=5;$F[4]+=5;$_=join ":",@F' the-file
С помощью sh
(предполагая, что эти числа всегда являются десятичными целыми числами без начальных нулей):
IFS=: read -r a b c d e < the-file &&
printf '%s\n' "$a:$b:$c:$((d-5)):$((e+5))" > the-file
В последних версиях GNU awk
:
gawk -i /usr/share/awk/inplace.awk -F: -vOFS=: '{$4-=5;$5+=5}1' the-file
Не использовать-i inplace
as сначала gawk
пытается загрузить inplace
расширение (как inplace
или inplace.awk
) из текущего рабочего каталога, где кто-то мог разместить вредоносное ПО. Путь расширения, inplace
поставляемого с, gawk
может различаться в зависимости от системы, см. выводgawk 'BEGIN{print ENVIRON["AWKPATH"]}'