Regex 带捕获的Sed转换

Regex 带捕获的Sed转换,regex,bash,sed,Regex,Bash,Sed,我正在尝试转换此字符串: {{# sender_phone }} 对于这一点: <% if sender_phone do %> 这也很好: $ echo '{{# sender_phone }}' | sed -e 's|{{# \(.*\) }}|<% \1 %>|g' <% sender_phone %> $ 试图让它不那么贪婪(注意一个?符号)我撞到了一堵墙-没有匹配的: $ echo '{{# sender_phone }} {{ somet

我正在尝试转换此字符串:

{{# sender_phone }}
对于这一点:

<% if sender_phone do %>
这也很好:

$ echo '{{# sender_phone }}' | sed -e 's|{{# \(.*\) }}|<% \1 %>|g'
<% sender_phone %>
$ 
试图让它不那么贪婪(注意一个
符号)我撞到了一堵墙-没有匹配的:

$ echo '{{# sender_phone }} {{ something else }}' | sed -e 's|{{# \(.*?\) }}|<% \1 %>|g'
{{# sender_phone }} {{ something else }}
$
$echo'{{{{35;发送者电话}{{{something}}}}sed-e的{{{{35; \(.*?\)}}}{124; g'
{{{发送者{电话}{{{其他东西}}
$

我缺少什么?

我不熟悉
sed
,但这里有一个使用Perl一行程序的正则表达式:

$ cat temp.txt 
{{# sender_phone }}
{{# sender_phone }} {{ something else }}

$ perl -pe 's/\{\{#\s*sender_phone\s*\}\}/<% if sender_phone do %>/' temp.txt 
<% if sender_phone do %>
<% if sender_phone do %> {{ something else }}
$cat temp.txt
{{{发送者电话}
{{{发送者{电话}{{{其他东西}}
$perl-pe的/temp.txt
{{其他东西}}

*
是贪婪的,
sed
没有惰性量词

但是,您可以使用此
sed

s='{{# sender_phone }} {{ something else }}'
sed -E 's/{{# *([_[:alnum:]]+) *}}/<% if \1 do %>/g' <<< "$s"
s='{{{{{发送者{电话}}{{{其他东西}}

sed-E的/{{{{}*([[uu[:alnum:]+])*}//g'对OP当前的
sed
调用进行了一些简单的更改:

# current
echo '{{# sender_phone }} {{ something else }}' | sed -e 's|{{# \(.*\) }}|<% \1 %>|g'
<% sender_phone }} {{ something else %>

# new/proposed
echo '{{# sender_phone }} {{ something else }}' | sed -e 's|{{# \(.*\) }}[^}]|<% \1 %> |g'
<% sender_phone %> {{ something else }}
#当前
回音{{{发送者{电话}{{其他东西}}sed-e的{{{发送者}(.*)}}}g'
#新建/提议
回音{{{发送者{u电话}{{其他东西}}sed-e的{{{{发送者}(.*)}[^}]{g'
{{其他东西}}
关键是通过添加
[^}]
将匹配限制到它找到的第一个
}
,本质上,这表示继续匹配到下一个
}

此更改本身将在
{{..}
字符串之间生成所需的输出,因此我还在替换模式
的末尾添加了一个额外的(空格)


注意:如果你知道双大括号是成对出现的,也就是说,在
}
之前总是有一个
{{
}
,那么你也可以使用
[^{]

我通常只使用
[^]*
恢复OP添加的原始标记,以突出问题的性质,即
sed
中的
regex
。此处唯一可能冗余的标记是
bash
,但
sed
regex
都是相关的。
s='{{# sender_phone }} {{ something else }}'
sed -E 's/{{# *([_[:alnum:]]+) *}}/<% if \1 do %>/g' <<< "$s"
<% if sender_phone do %> {{ something else }}
# current
echo '{{# sender_phone }} {{ something else }}' | sed -e 's|{{# \(.*\) }}|<% \1 %>|g'
<% sender_phone }} {{ something else %>

# new/proposed
echo '{{# sender_phone }} {{ something else }}' | sed -e 's|{{# \(.*\) }}[^}]|<% \1 %> |g'
<% sender_phone %> {{ something else }}