首页 > 解决方案 > 从包含“\n”的变量中插入字符串而不用换行文字替换

问题描述

我有一个从 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's 保留在它们所在的位置而不扩展它们。

想法?谢谢!

标签: bashawksed

解决方案


鉴于:

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.

也总是引用你的shell变量(谷歌它)永远不要按照惯例对非导出的shell变量使用全部大写,并避免与环境变量发生冲突。

因此,假设您在上面的分配中使用 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

推荐阅读