消除特定记录上的前导零

消除特定记录上的前导零

只需要从预告片记录中消除前导零。

 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|03

我能够做到这一点:

 sed -e 's/T|0*/T|/g' SampleFileName

我在 the 之后去掉了预告片上的前导零,T|32.25但没有去掉03after 。

答案1

使用 sed

如果您只想在最后一个字段上进行替换,则需要将正则表达式锚定到行尾:

$ sed -Ee '/T/ s/[|]0*([[:digit:]]+)$/|\1/' SampleFileName
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|03

$仅在行尾匹配。 (可选)/T/条件将替换限制为包含T.

上面的内容是在 GNU sed 上测试的,但我希望它也能在 BSD (OSX) sed 上工作。

使用 awk

awk 将行划分为字段。使用 awk,我们只能对最后一个字段执行替换(awk 调用$NF):

$ awk -F'|' '/T/{sub(/^0+/,"",$NF)} 1' OFS='|' SampleFileName 
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|032.25|3

答案2

您还可以使用 perl 作为 oneliner 命令。例如对于这个问题你可以使用:

 $ perl -p -e 'if (/^T/) { s/\|0*/\|/g } ' SampleFileName
 H|09/24/2015
 D|25.00|Name1|Tfile|5
 D|7.25|Name2|Tfile|1
 T|32.25|3
 $  

if正则表达式中检查行是否以字母开头T(因为我假设这些行是目标行),并且在{ }块正则表达式中替换|管道后的所有零。

答案3

另一条 Perl 语句:

perl -pe 's/\|0+(?=\d)/|/g if /^T\|/;'

上面的内容将分别翻译为T|00|和。T|00.00|T|0|T|0.00|

相关内容