【问题标题】:preserve newlines in sed replacement pattern在 sed 替换模式中保留换行符
【发布时间】:2015-10-21 10:31:18
【问题描述】:

所以我有一个实现简单液体样式模板的 bash 函数:

template () {
    key=$(echo "$2" | tr -d '[:space:]')

    # escape slashes
    value=$(echo $3 | sed -e 's/\\/\\\\/g' -e 's/\//\\\//g' -e 's/&/\\\&/g') 
    echo "$1" | sed "s/{{$key}}/$value/g; s/{{$key:[^}]*}}/$value/g"
}

这样template foo bar zorp 将在给定的foo 模板中将{{bar}} 替换为zorp

我的问题是,将此函数的输出作为值返回会导致换行符被剥离,并最终因行长限制而出现 sed 错误。有没有办法逃避换行符,让它们完整地通过模板?

【问题讨论】:

  • tr -d '[:space:]' 删除换行符...
  • 对,但我不太关心密钥。这正是我要替换的。
  • 最后一行 echo "$1" > /tmp/file; sed '...' /tmp/file 怎么样?

标签: bash shell sed


【解决方案1】:

去除换行符的不是 sed,而是您处理输出的方式。如果您将输出捕获到新模板中,请注意不要将其“展平”。

foo2=$(template "$foo" bar zorp)
foo3=$(template "$foo2" moo burp)

【讨论】:

  • 所以当我运行模板函数时,foo3 的情况实际上很好。我的主要问题是 foo4=$(template "$foo3" blah "$foo2")。当我将输出作为替换值传回时,它就会变平。
  • 我明白了。所以你的意思是你的替换字符串可能包含换行符。这在原帖中并不清楚。看看value=$(echo $3 | ...,这就是换行符被剥离的地方。用"$3"保护他们
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 2014-04-24
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多