Bash 在sed替换模式中保留换行符

Bash 在sed替换模式中保留换行符,bash,shell,sed,Bash,Shell,Sed,因此,我有一个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:[^}]*}}

因此,我有一个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
模板中用
zorp
替换
{{bar}}


我的问题是,将这个函数的输出作为一个值返回会导致换行被剥离,并最终消除由于行长度限制而产生的错误。有没有办法转义换行符,使它们完整地通过模板?

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

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

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

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

tr-d'[:space:]
删除新行…对,但我不太关心键。这正是我要替换的内容;sed'…'/tmp/file作为最后一行?
tr-d'[:space:'
删除新行…对,但我不太关心键。这正是我要替换的内容;sed“…”/tmp/file作为最后一行?所以当我运行模板函数时,foo3的情况实际上是好的。我的主要问题是foo4=$(模板“$foo3”等等“$foo2”)。当我把输出作为替换值传回来时,就是它变平的时候。我明白了。您的意思是替换字符串可能包含换行符。这在最初的帖子中并不清楚。看看
value=$(echo$3 |…
,这就是新行被剥离的地方。用
“$3”
屏蔽它们,这样当我运行模板函数时,foo3的情况实际上是好的。我的主要问题是foo4=$(模板“$foo3”废话“$foo2”)。当我将输出作为替换值传递回时,就是它变平的时候。我明白了。你的意思是替换字符串可能包含换行符。这在原始帖子中不清楚。请看
value=$(echo$3 |…
,这就是换行符被剥离的地方。用
“$3”
屏蔽它们