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

时间:2018-09-11 09:07:59

标签: bash macos shell sed

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

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上写

1 个答案:

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