繁体   English   中英

sed错误未终止的换行文本替换模式

[英]sed error unterminated substitute pattern for new line text

我正在编写一个脚本,将新的依赖项添加到监视列表。 我正在放置一个占位符以了解在何处添加文本,例如

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

sed -i '' s/'assets\"\
   #'/'some new text'/ filename.txt

PS:我在macOS上写作

Sed在逐行的基础上工作,因此将昏迷添加到前一行很困难,因为该行已经被处理过。 可能,但是sed语法很快变得混乱。

更具体一点:

在默认操作中, sed周期性地将输入行(减去其终止<newline>字符)附加到模式空间中 如果在D命令结束前一个循环之前,在模式空间中有<newline>,则应跳过从输入的读取。 然后,sed实用程序应按顺序应用地址选择该模式空间的所有命令,直到命令开始下一个周期或退出为止。 如果没有命令明确地开始一个新的循环,那么在脚本结尾,应将模式空间复制到标准输出 (指定-n时除外), 并应删除模式空间 每当将模式空间写入标准输出或命名文件时,sed应立即在其后跟一个<newline>。

简而言之,如果您不操纵模式空间 ,就不能处理<newline>字符,因为它们不会出现!

更短的是,如果仅使用替代命令,则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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM