从包含“ \ n”的变量中插入字符串,而不用换行符替换

时间:2019-04-01 14:37:40

标签: bash awk sed

我有一个从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=$AGENTtext=${AGENT}text='"$AGENT"',这些变体显然都无济于事。我希望所有这些都直接插入html文件中的单个长行,并保持\n所在的位置而不扩展它们。

有什么想法吗?谢谢!

1 个答案:

答案 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