sed条件替换变量

时间:2012-10-21 19:58:11

标签: regex sed

我在一个文件中有一堆代码,通常都是这样的形式,integer.integer第一个整数是必需的,第二个可能是空的。例如123.45或12.345和12都是有效的密码。

我想用sed将每一行改为

job{123}subjob{45}
job{12}subjob{345}
job{12}  

到目前为止我已经

sed -e 's/codenumber{\([0-9]*\)\.*\([0-9]*\)}/job{\1}subjob{\2}/g'

导致

job{123}subjob{45}
job{12}subjob{345}
job{12}subjob{}

有没有办法让sed意识到当变量\ 2为空时,要打印一个默认值,比如说0.因此,给定示例的最后一行会说

job{12}subjob{0}

我想这可能是通过两次sed运行实现的,但我感兴趣的是它是否可以用一个。

4 个答案:

答案 0 :(得分:3)

您可以简单地扩展sed命令以修补空的子工作号:

sed -e 's/codenumber{\([0-9]*\)\.*\([0-9]*\)}/job{\1}subjob{\2}/g' \
    -e 's/subjob{}/subjob{0}/g'

答案 1 :(得分:1)

我不认为这在sed中是可能的。但实际上你可以做两次sed运行(它们真的很快,所以它应该不是问题),第二次运行

sed -e 's/subjob\{\}//g'

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed 's/codenumber/job/;s/\./}subjob{/;/subjob/!s/$/subjob{0}/' file

答案 3 :(得分:0)

我知道,有点晚了,而且还没有回答问题,但是如果有人像我一样来到这里,并且不介意使用 Perl,那么表达式是:

s/codenumber{([0-9]*)\.*([0-9]*)}/job{$1}subjob{${\($2?$2:"0")}}/g

例如在:

echo -e 'codenumber{123.45}\ncodenumber{12.345}\ncodenumber{12}' | perl -e 'while(<STDIN>) { print s/codenumber{([0-9]*)\.*([0-9]*)}/job{$1}subjob{${\($2?$2:"0")}}/gr;}'

所以,重点是 Perl 允许您也在正则表达式中使用字符串插值 ${\(EXPRESSION)} 并使用 Perl 表达式根据匹配的值计算替换。