ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

#!/bin/shコミュのsh sedコマンド

  • mixiチェック
  • このエントリーをはてなブックマークに追加
スクリプトの質問ではないのですが、
sedを使っての置換の仕方です。
最終的には、
スクリプトに組み込もうと思っているので、
ここに書き込みました。

OSは"CentOS5.3"です。

質問は3つあります。

1)数値を0にしたい
--------------------------------
aaaa 1234.123K

aaaa 0K
--------------------------------

2)小数点以下を削除したい
---------------------------------
bbb 234.123 M

bbb 234 M
---------------------------------

3)小数点を削除したい
---------------------------------
ccc 123.456G

ccc 123456G
---------------------------------

いずれも、
桁数は決まっていません。
K、M、Gに関しては、
ついてもつかなくてもかまいません。

sedを使って行いたいと思っています。
(1行で全部とは思っていません。コマンドは3つ打つつもりです。)
わかる方、よろしくお願いします。


コメント(17)

1)
sed -e 's/[0-9]+|[0-9]+\.[0-9]+/0/g' 置換させたいファイル名

2)
sed -e 's/([0-9]+)(\.)([0-9]+)/\1/g' 置換させたいファイル名

3)
sed -e 's/([0-9]+)(\.)([0-9]+)/\1\3/g' 置換させたいファイル名

かなあ。試してないけど。
コメントを参考して、
1)、2)は出来ました。

ありがとうございます。

1)
sed "s/[0-9]*.[0-9]*\ K/0\ K/g" 置換させたいファイル名

2)
sed s/.[0-9]*\ M/\ M/g 置換させたいファイル名

3)に関しては、
小数点を削除したいのですが、
うまくいっていません。

引き続き、
わかる方お願いします。

>3)に関しては、
>小数点を削除したいのですが、
>うまくいっていません。
どうなっちゃってます?
sed -e 's/\([0-9][0-9]*\)\.\([0-9][0-9]*\)/\1\2/g' 置換させたいファイル名
でどうです?

1と2も「*」だけだとちょっと怪しいかも。
もしひとつ以上数字があるという条件ならPOSIX拡張表現の「+」相当でないと。
ありがとうございます。
できました。

>sed -e 's/\([0-9][0-9]*\)\.\([0-9][0-9]*\)/\1\2/g' 置換させたいファイル名

上記内容でも大丈夫でしたが、
説明がちょっと足りなかったのですが、
ファイル内のすべての少数点を削除するので、

sed -e 's/\([0-9][0-9]*\)\.\([0-9][0-9]*\)\ G/\1\2\ G/g' 置換させたいファイル

上記内容にしました。(”\ G”を追加して、そこだけの置換にしました。)

それと、

sed -e 's/\([0-9]*\)\.\([0-9]*\)\ G/\1\2\ G/g' 置換させたいファイル

上記のように、
[0-9][0-9]*\→[0-9]*\
[0-9]をひとつにしても大丈夫でした。

masaさん、じるさん、
本当に助かりました。
ありがとうございます。^^
余計なお世話かもしれませんが。。。

> [0-9][0-9]*\→[0-9]*\
> [0-9]をひとつにしても大丈夫でした。

私が言いたかったのは
「ひとつ」にすると、[0-9]が"ない"にもマッチします。
気をつけてくださいね、ということです。

たとえば[0-9]*で
sed -e 's/\([0-9]*\)\.\([0-9]*\)/\1\2/g'
とした場合、abc.defも「.」だけにマッチしてabcdefになります。


後ろに Gがつくというマッチの条件があるようなので、少しはましですが。。

単にマッチするということだけではなく
意図したところだけにマッチするってことを考えないといけないと思います。
まぁ、どう使うのかわからないので、
もしかしたらそんな心配無用なのかも、ですね。

とりあえず、解決したようで、良かったです。
>「ひとつ」にすると、[0-9]が"ない"にもマッチします。

そのとおりでした。
[a-z]にしても、同じ結果でした。

sed -e 's/\([0-9][0-9]*\)\.\([0-9][0-9]*\)/\1\2/g'  置換させたいファイル名

↑が正確です。

>後ろに Gがつくというマッチの条件があるようなので、少しはましですが。。

そのとおりでした。
Gがついているので、そこを置換しているようでした。
数字は、関係ない状況になっていました。

指摘していただいて、
ありがとうございます。
お手数おかけました。
>>9
カッコの外側に絶対に数字がこないのであれば、数字だけに注目すればよくなり簡単になりそうですが、どうでしょう?
>9
数字だけに注目すると、セパレータを数字以外にして、
BEGIN{FS="[^0-9]+"}
{for(i=2;i<NF;i++){
if($i>700) { 700以上の時の処理 }
}}
>>9
カッコの外に数字がなく、行単位のチェックでよいと仮定すれば、次のパターンにマッチするか調べるだけになりますね。マッチする行は700以上の数値を含みます。

/[7-9][0-9]{2}|[1-9][0-9]{3}/

1000以上がこないとわかっていれば、より簡単に…。
久々にage...

あるパターン(正規表現)にマッチした行から、前m行目〜後n行目までを抽出(標準出力に出力)
ってどうやればいいでしょうか?
↑ 補足追加
m,nは固定です。

また、解決を急ぐので
http://mixi.jp/view_bbs.pl?id=12041954&comm_id=1615
とマルチポストにしちゃいますがお許し下さい。
両投稿先共コメントにはフォロー(各投稿先での分かった事を双方へ反映)します。
sedにこだわらないならgrepに-Bと-Aがありますが
>15 ?くす!!!! 明日試してミルク酢。

http://www.smokeymonkey.net/2007/06/grep.html

# -B NUM (--before-context=NUM)
# -C NUM (--context=NUM)
# -A NUM (--after-context=NUM)
マッチした行+NUMで指定した行数を表示します。
Bなら前の行、Cなら前後の行、Aなら後の行です。
例:
$ cat data.txt
ABCDE
FGHIJ
KLMNO
PQRST
UVWXY
$ grep -B 1 "LMN" data.txt
FGHIJ
KLMNO
$ grep -C 1 "LMN" data.txt
FGHIJ
KLMNO
PQRST
$ grep -A 1 "LMN" data.txt
KLMNO
PQRST
上記の方法はうまくいきました…がいざやってみると本当に欲しい結果はもう少し複雑であることが分かりました…アジャイルですね(違うかw

甘えついでに更に教えて下さい。本当に欲しい結果は以下でした。

あるパターン(正規表現)にマッチした行から、
…、前m3行目、前m2行目、前m1行目、あるパターン、後n1行目、後n2行目、後n3行目、…
を抽出(標準出力に出力)です。m3、m2、m1、n1、n2、n3は固定です。

例:

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
やいゆえよ
らりるれろ
わいうえを

で「みむめ」行を見つけ、その1行前、4行前、2行後を抽出。

結果:
さしすせそ
はひふへほ
まみむめも
らりるれろ

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

#!/bin/sh 更新情報

#!/bin/shのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング