bash - 从包含“\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 保留在它们所在的位置而不扩展它们。
想法?谢谢!
解决方案
鉴于:
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
推荐阅读
- docker - jupyter notebook 在远程服务器上的 docker 中运行:keras 不使用 gpu
- java - Gradle:如何在 Gradle 插件中派生项目目录路径?
- reactjs - 为什么这个组件在状态改变时会渲染两次?
- flutter - 如何使用字符串访问属性或方法?
- javascript - 如何根据日期对 Firebase 用户进行排序?
- angular - 是否可以使用 NgRx createSelector 发出错误?
- python - 如何在 Jupyter Notebook 中运行 shell 脚本?
- sql-server - Azure SQL DW COPY 命令失败并出现语法错误
- python - Looking to automate seller login portal with Python and Selenium , find xPath
- cucumber - Maven Surefire 报告显示跳过的测试为通过