我有一個包含一些負數的文字文件,除了它們的格式如下:
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'