使用 sed 或 awk 重新格式化负数

使用 sed 或 awk 重新格式化负数

我有一个包含一些负数的文本文件,除了它们的格式如下:

00000012-

数字后面有连字符。

我正在使用 awk 处理该文件,将其重新格式化为 SQL 插入命令,但 SQL 解释器因数字而窒息,因为负号出现在数字后面。

是否有正则表达式可以将负号移动到数字之前?

答案1

sed

echo 00000012- |  sed -e 's/\([0-9]+\)\(-\)\?/\2\1/'

给出-00000012.

也就是说,匹配两组,第一组与数字,第二组与符号,但使用零个或多个匹配,然后将两者互换。

答案2

相反,依靠 SQL 来解决问题:

create table #Tempt (Value VarChar(100))

Insert Into #Tempt Values(NULL)
Insert Into #Tempt Values('500.1-')
Insert Into #Tempt Values('-500.1')
Insert Into #Tempt Values('20.5')


select *, case when Value like '%-' then '-' + replace(value,'-',') else value end
 From   #Tempt

然后使用批量插入将值从#Tempt您的实际表中提取出来。


取自批量插入负值

为什么人们总是期望程序员清理这样的愚蠢的东西?

你不是唯一一个...

答案3

使用 sed:

sed -e 's/\<\([0-9.]\+\)-/-\1/g'

或者

sed -E -e 's/\<([0-9+]+)-/-\1/g'

使用 GNU awk:

awk '{$0=gensub(/\<([0-9.]+)-/,"-\\1","g"); print }'

注意:需要 GNU awk 才能gensub()运行。也不sub()支持gsub()捕获组。

使用 Perl:

perl -p -e 's/\b([\d.]+)-/-$1/g'

相关内容