我在一个文件中有一堆代码,通常都是这样的形式,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运行实现的,但我感兴趣的是它是否可以用一个。
答案 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 表达式根据匹配的值计算替换。