![消除特定记录上的前导零](https://linux22.com/image/73683/%E6%B6%88%E9%99%A4%E7%89%B9%E5%AE%9A%E8%AE%B0%E5%BD%95%E4%B8%8A%E7%9A%84%E5%89%8D%E5%AF%BC%E9%9B%B6.png)
只需要从预告片记录中消除前导零。
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
但没有去掉03
after 。
答案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|