sed 替换所有出现的带有嵌入减号“-”的左零填充数字,以便减号位于左侧

sed 替换所有出现的带有嵌入减号“-”的左零填充数字,以便减号位于左侧

我有一个制表符分隔的输入文件。某些数字字段值的值中间有一个减号,例如000-45.123。我需要-像这样位于左侧: -00045.123

因此,如果制表符分隔的输入文件包含:(空格是制表符)

ABC 000-45.123 0-765.43 DEF 00-54 XYZ

那么我想要的结果是

ABC -00045.123 -0765.43 DEF -0054 XYZ

所有带有嵌入“-”的数值均以 1 个或多个零开头,并且没有其他字符。

注意:我没有可用的选项:sed -r 或 sed -E

答案1

使用 GNU sed:

将顺序从数字和减号更改为减号和数字。

sed -r 's/([0-9]+)(-)/\2\1/g' file

输出:

ABC -00045.123 -0765.43 DEF -0054 XYZ

看:Stack Overflow 正则表达式常见问题解答

答案2

POSIXly:

TAB=$(printf '\t')
sed "s/^\(00*\)-/-\1/;s/${TAB}\(00*\)-/$TAB-\1/g"

我们需要考虑第一个字段(00-在行的开头)或其他字段(00-在 TAB 后面)的两种情况。

通过sed实现支持-E(用于扩展正则表达式)和 shell 支持$'...'(两者都可能成为 POSIX 规范的未来版本),您可以将其简化为:

sed -E $'s/(^|\t)(0+)-/\1-\2/g'

反而。

相关内容