【问题标题】:sed error unterminated substitute pattern for new line text新行文本的 sed 错误未终止替换模式
【发布时间】:2019-02-15 18:05:13
【问题描述】:

我正在编写一个脚本来将新的依赖项添加到监视列表中。我正在放置一个占位符来知道在哪里添加文本,例如

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

【问题讨论】:

    标签: bash macos shell sed


    【解决方案1】:

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 2018-03-22
      • 2014-09-11
      • 2012-05-05
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多