我有一个制表符分隔的输入文件。某些数字字段值的值中间有一个减号,例如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
答案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'
反而。