我有一个包含一些负数的文本文件,除了它们的格式如下:
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'