3

我在一个文件中有一堆代码编号,它们的格式通常为 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

4 回答 4

3

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

sed -e 's/codenumber{\([0-9]*\)\.*\([0-9]*\)}/job{\1}subjob{\2}/g' \
    -e 's/subjob{}/subjob{0}/g'
于 2012-10-21T23:51:51.413 回答
1

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

sed -e 's/subjob\{\}//g'
于 2012-10-21T20:01:35.373 回答
1

这可能对您有用(GNU sed):

sed 's/codenumber/job/;s/\./}subjob{/;/subjob/!s/$/subjob{0}/' file
于 2012-10-21T23:52:04.167 回答
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 表达式根据匹配的值计算替换。

于 2021-02-23T17:39:17.283 回答