我有一个从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
所在的位置而不扩展它们。
有什么想法吗?谢谢!
答案 0 :(得分:2)
给出:
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
)来想象差异。
还总是用引号引起来(用谷歌搜索它),不要为约定未导出的外壳变量使用所有大写字母,并避免与环境变量冲突。
因此,假设您在上面的分配中使用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