使用 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'

相關內容