我正在编写一个脚本,将新的依赖项添加到监视列表。我正在放置一个占位符,以了解在何处添加文本,例如
WHERE
仅更换占位符很简单,但是我的问题是在前一行添加逗号。
如果我搜索并替换
可以完成assets = [
"../../new_app/assets"
# [[NEW_APP_ADD_ASSETS]]
]
即"
# [[NEW_APP_ADD_ASSETS]]
我无法搜索新行。
我发现的用于添加新行的解决方案之一是
"\n # [[NEW_APP_ADD_ASSETS]]
但是以相同的方式搜索字符串时,它会返回sed -i '' 's/newline/line one\
line two/' filename.txt
:unterminated substitute pattern
PS:我在macOS上写
答案 0 :(得分:3)
Sed在逐行的基础上工作,因此将昏迷添加到前一行很困难,因为该行已经被处理过。可以,但是sed
语法很快就会变得混乱。
更具体一点:
在默认操作中,周期性地sed会将输入行(减去其终止的
字符)追加到模式空间 。如果在D
命令结束前一个循环之前,在模式空间中有,则应跳过从输入的读取。然后,sed实用程序应按顺序应用地址选择该模式空间的所有命令,直到命令开始下一个周期或退出为止。如果没有命令明确地开始一个新的周期,则在脚本末尾,模式空间应复制到标准输出(除非指定了 -n
)和模式空间应删除。每当将模式空间写入标准输出或命名文件时,sed应立即在其后跟一个。
简而言之,如果您不操纵图案空间,则您将无法处理
更短的是,如果仅使用替代命令,则sed一次只能处理一行!
这也是您遭受: unterminated substitute pattern
困扰的原因。您正在搜索换行符,但是sed一次只能读取一行,因此找不到它,也不会期望它。如果将换行符替换为符号\n
,该错误将消失。
sed -i '' s/'assets\"\n #'/'some new text'/ filename.txt
实现目标的更好方法是利用awk
。它更具可读性:
awk '/# [[NEW_APP_ADD_ASSETS]]/{ print t","; t="line1\nline2"; next }
{ print t; t=$0 }
END{ print t }' <file>