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 }}