5

I have a set of .csv files (all in one folder) with the format shown below:

170;151;104;137;190;125;170;108
195;192;164;195;171;121;133;104
... (a lot more rows) ...

The thing is I screwed up a bit and it should look like this

170;151;104.137;190.125;170;108
195;192;164.195;171.121;133;104 

In case the difference is too subtle to notice:

I need to write a script that changes every third and fifth semicolon into a period in every row in efery file in that folder.

My research indicate that I have to devise some clever sed s/ command in my script. The problem is I'm not very good with regular expressions. From reading the tutorial it's probably gonna involve something with /3 and /5.

4

2 に答える 2

4

これを行うための非常に短い方法を次に示します。

sed 's/;/./3;s/;/./4' -iBAK *

の 3 番目と 5 番目 (現在は 4 番目) のインスタンスを に置き換え;ます.

サンプルでテストしました(sample.txtとして保存):

$ sed 's/;/./3;s/;/./4' <sample.txt
170;151;104.137;190.125;170;108
195;192;164.195;171.121;133;104

安全のために、私の例では元のファイルを としてバックアップしました<WHATEVER>.BAK。これを防ぐには、 に変更-iBAK-iます。


このスクリプトは完全に移植可能ではないかもしれませんが、私は Mac 10.8 で BSD sed (どのバージョンかわかりません) と Linux で sed (gsed) 4.1.4 (2003) でテストしました。@JonathanLeffler はsed、2008 年時点で標準の POSIX であると述べています。私もそれを見つけたばかりで、とても気に入っています。


ゴルフのヒント: bash からコマンドを実行する場合、ブレース展開を使用して非常に短いバージョンを実現できます。

sed -es/\;/./{3,4} -i *
于 2012-09-09T00:16:35.767 に答える
1

1 つの方法を次に示します。

sed -i 's/^\([^;]*;[^;]*;[^;]*\);\([^;]*;[^;]*\);/\1.\2./' foldername/*

(免責事項:これをテストしましたが、一部の詳細はsed完全に移植可能ではありません。上記には移植できないものはないと思いますので、問題ないはずですが、実行する前にまずフォルダーのバックアップコピーを作成してください念のため。)

于 2012-09-09T00:10:54.433 に答える