Вставить строку из переменной, содержащей "\ n", не заменяя литералами новой строки - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть строка, которую я записываю из команды curl в переменную.Строка содержит несколько кодов JavaScript и новой строки (\n).Как я могу вставить этот текст в файл по определенному номеру строки, без sed или awk, не задушивая последовательности или обрабатывая их в буквально новые строки?Вот что у меня есть:

AGENT=`curl -s -X GET 'https://some.web.site/api/blah.json | jq '.blah[].javascript'`
LOC=`grep -n "locationmatchstring" file.htm | cut -d : -f 1`

awk -v line=$LOC -v text="$AGENT" '{print} NR==line{printf "    " text}' file.htm

Суть в том, что я извлекаю скрипт из источника json и вставляю его в html-страницу в правильном месте, основываясь на строке соответствия местоположения, так какновая строка после совпадения местоположения.Я также добавляю 4 пробела перед захваченной строкой, чтобы она соответствовала интервалу, используемому в html-файле.Я пробовал некоторые варианты text="$AGENT", такие как text=$AGENT, text=${AGENT}, text='"$AGENT"', которые явно не помогли.Я хотел бы, чтобы все это помещалось прямо в одну длинную строку в html-файле и сохраняло \n там, где они есть, не раскрывая их.

Мысли?И спасибо!

1 Ответ

2 голосов
/ 01 апреля 2019

Дано:

var='foo\nbar'

Обратите внимание на разницу:

$ awk -v var="$var" 'BEGIN{print "<" var ">"}'
<foo
bar>

$ var="$var" awk 'BEGIN{var=ENVIRON["var"]; print "<" var ">"}'
<foo\nbar>

$ awk 'BEGIN{var=ARGV[1]; ARGV[1]=""; print "<" var ">"}' "$var"
<foo\nbar>

Подробнее см. http://cfajohnson.com/shell/cus-faq-2.html#Q24.

Никогда не делайте printf <input data> кстати, если толькоВы имеете в виду ОЧЕНЬ конкретную цель и полностью понимаете все предостережения / последствия.Вместо этого сделайте printf "%s", <input data> - представьте себе разницу, если / когда <input data> включает символы форматирования printf, такие как %s.

Также всегда всегда указываются переменные вашей оболочки (google it), никогда не используйте весь верхний регистр для неэкспортированной оболочкипеременные по соглашению и во избежание конфликта с переменными окружения.

Таким образом, если вы используете loc вместо вместо LOC и agent вместо AGENT в назначении над ним, вся ваша строка awk будет (если ваш awk поддерживает ENVIRON, в противном случае используйтеподход ARGV выше):

agent="$agent" awk -v line="$loc" 'BEGIN{text=ENVIRON["agent"]} {print} NR==line{printf "    %s", text}' file.htm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...