Поскольку вы ищете арифметические тесты, а регистр не выполняет арифметические действия, if-then
кажется естественным подходом:
if [ "$cmils" -lt 320 ]
then
cawg="??"
elif [ "$cmils" -le 403 ]
then
cawg="25 AWG"
elif [ "$cmils" -le 509 ]
then
cawg="24 AWG"
elif [ "$cmils" -le 641 ]
then
cawg="23 AWG"
fi
Я предпочитаю портативные решения, но некоторым нравится арифметический синтаксис bash:
if ((cmils < 320))
then
cawg="??"
elif ((cmils <= 403))
then
cawg="25 AWG"
elif ((cmils <= 509))
then
cawg="24 AWG"
elif ((cmils <= 641))
then
cawg="23 AWG"
fi
Этот синтаксис более мощный и более хрупкий, чем синтаксис POSIX. Чтобы понять почему, попробуйте этот код после установки cmils=cmils
.
С помощью Gnu sed вы можете сделать это. Я использую вашу команду find и изменил в ней часть sed.
$ find ${location} -type f -name "*.xml" -path "*/adult/*" -exec sed -i -e '/<\/autoReferenceLines>/!b' -e 'h;s/\S.*/<ztv>0<\/ztv>/;H;g' {} +
Или растянуть с помощью экранированных символов новой строки, но по-прежнему считать одной строкой:
$ find ${location} -type f \
-name "*.xml" -path "*/adult/*" \
-exec sed -i \
-e '/<\/autoReferenceLines>/!b' \
-e 'h;s/\S.*/<ztv>0<\/ztv>/;H;g' \
{} +;
Рабочий:
Написанный вами find
прекрасно выбирает необходимые файлы, которые необходимо отредактировать с помощью sed
.
Команда sed просматривает строки, в которых присутствует строка автоматической ссылки. Он хранит копию:h
до того, как мы начнем над ней операцию. Затем, начиная с первого непробельного символа \S
до конца строки, мы стираем все это. Так что теперь у нас остались начальные пробелы (, если они есть ). Пока мы это делаем, мы также вставляем нужную строку ztv. Итак, теперь у нас есть такое же количество начальных пробелов плюс желаемая строка.
Затем мы добавляем эту только что созданную строку к исходной сохраненной строке H
и помещаем ее g
в пространство шаблонов.
Параметр -i
при использовании с несколькими файлами для gnu sed подразумевает -s
, поэтому мы не указываем его явно.
Эта команда должна делать то, что вы хотите:
find ${location} -type f -name "*.xml" -path "**/adult/**" -exec grep -q '</autoReferenceLines>' {} \; -exec perl -i"*" -ne 'print; print "$1<ztv>0</ztv>\n" if (m[^(\s*).*</autoReferenceLines>])' {} \;