![sed または awk で負の数を再フォーマットする](https://rvso.com/image/89140/sed%20%E3%81%BE%E3%81%9F%E3%81%AF%20awk%20%E3%81%A7%E8%B2%A0%E3%81%AE%E6%95%B0%E3%82%92%E5%86%8D%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%99%E3%82%8B.png)
いくつかの負の数値を含むテキスト ファイルがありますが、それらは次のようにフォーマットされています。
00000012-
数字の後にハイフンを付けます。
私は awk を使用してファイルを処理して SQL 挿入コマンドに再フォーマットしていますが、数字の後に負の符号が表示されるため、SQL インタープリターが数字の処理に失敗します。
マイナス記号を数字の前に移動できる正規表現はありますか?
答え1
とsed
:
echo 00000012- | sed -e 's/\([0-9]+\)\(-\)\?/\2\1/'
を与えます-00000012
。
つまり、最初の数字と2番目の符号の2つのグループを一致させるが、0以上の一致を使用する。それ、そして 2 つを入れ替えて置き換えます。
答え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 }'
注意:gensub()
関数には GNU awk が必要です。 も もキャプチャ グループをサポートしていませsub()
ん。gsub()
perlの場合:
perl -p -e 's/\b([\d.]+)-/-$1/g'