BSD sed, Как вставить строку с переменными

Я использую MacOSX для создания этого bash-скрипта, скрипт проверяет другие файлы и сравнивает содержимое друг с другом, что создает увеличивающийся счетчик. Функции, использующие счетчики, должны выполняться первыми, чтобы переменные содержали информацию, поэтому кажется, что лучшим вариантом будет вставка строки через команду sed. Есть ли способ сделать так, чтобы я мог игнорировать буквальную часть, которую создают одинарные кавычки? Это тоже BSD sed, а не GNU sed. Или, если есть альтернативный вариант, кроме использования sed, мне было бы интересно узнать, как это сделать.

КОД:

sed -i '' '3i\
There are a total of ${ALOLANCOUNT} Pokemon in Alola, and you have ${HAVECOUNTER}, and need ${ALOLANNEEDCOUNTER}' $LOGFILE
sed -i '' '3i\
There are a total of ${NATIONALCOUNT} Pokemon in the world, and you need ${NATNEEDCOUNTER}' $LOGFILE

ВЫХОД:

There are a total of ${NATIONALCOUNT} Pokemon in the world, and you need ${NATNEEDCOUNTER}
There are a total of ${ALOLANCOUNT} Pokemon in Alola, and you have ${HAVECOUNTER}, and need ${ALOLANNEEDCOUNTER}

person scoop263    schedule 01.12.2017    source источник


Ответы (1)


Переменные не раскрываются внутри '...'. Измените одинарные кавычки на двойные. С другой стороны, \ внутри двойных кавычек будет интерпретироваться как экранирование новой строки, которая следует за ним, но в этом случае вам нужно, чтобы это был литерал \ для команды i команды sed. Внутри двойных кавычек вам нужно написать это как \\.

Собирая это, напишите так:

sed -i '' "3i\\
There are a total of ${ALOLANCOUNT} Pokemon in Alola, and you have ${HAVECOUNTER}, and need ${ALOLANNEEDCOUNTER}" $LOGFILE

Как указал @EdMorton, будет более надежным использовать одинарные кавычки и выходить из них по мере необходимости. заключать в двойные кавычки только определенные части, где используются переменные, например:

sed -i '' '3i\
There are a total of '"${ALOLANCOUNT}"' Pokemon in Alola, and you have '"${HAVECOUNTER}"', and need '"${ALOLANNEEDCOUNTER}" $LOGFILE

Это более надежно, потому что таким образом вам не нужно сканировать всю строку, если есть что-то, что может потребоваться экранировать, например \ в моем первом предложении.

person janos    schedule 02.12.2017