- - PR -
シェルでの文字列操作について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-01-15 19:32
bashを使用しています。
以下のような感じで文字列を抜き出したいのですが、 どのコマンド組み合わせれば実現できるかご教示お願いいたします。 「aaa_bbbb_ccc1」という文字列を参照して、 「aaa1」という形で変数に設定したいです。 下記のようにすると「aaa」を取り出すことはできましたが、 「ccc1」の「1」をどのようにして取り出せばよいか わかりませんでした。 ========= NAME=aaa_bbbb_ccc1 NAME_1=`echo ${NAME} | /bin/awk -F "_" '{print $1}'` ========= cutなどを使用するのかと思いましたが、 上記文字数は変動します。 "_"の数は上記とおり、必ず2つ入ります。 以上です。よろしくお願いいたします。 _________________ | ||||
|
投稿日時: 2009-01-15 21:55
規則がわかりません。そこを明確にして下さい。 | ||||
|
投稿日時: 2009-01-16 01:00
最初に「_」が現れる直前までの文字、最後の数字の連続の結合ってルールかな?
これでいけるかもしれません。 NAME=aaabbb_bbbb_ccc22 NAME_1=`echo $NAME | grep -o '^[a-z]¥+'``echo $NAME | grep -o '[0-9¥+$'` echo $NAME_1 ※掲示板の都合上¥は全角にしてあります。 | ||||
|
投稿日時: 2009-01-16 11:25
ルールの説明不足の中、
ありがとうございます。 パーフェクトな結果です。感動しました。 ただ、[0-9]の後ろの"]"が抜けていたので、追記して対応しました。 NAME_1=`echo $NAME | grep -o '^[a-z]¥+'``echo $NAME | grep -o '[0-9]¥+$'` 以上です。ご協力ありがとうございました。 | ||||
|
投稿日時: 2009-01-16 13:01
bashなのですから、bashの機能でやればすっきりするのですが…
$ hoge=aaa_bbb_ccc234 $ echo ${hoge/_*_*[^0-9]/} aaa234 ただ、2番目の _ の直後にすぐ数字が来るケースには対応できないので、より粗いパターンマッチにするなら、 $ hoge=aaa_bbb_234 $ echo ${hoge/_*[^0-9]/} aaa234 bash固有の機能だと云々、という話なら、${VAR##パターン} や ${VAR%%パターン} の組み合わせでも良いかも知れませんが、 $ hoge=aaa_bbb_234 $ echo $(echo "$hoge" | sed -e 's/_[^_]*_[^0-9]*//') aaa234 でも良いでしょう。 ※詳しくは、bash や sed や regex の manページを参照してください [ メッセージ編集済み 編集者: angel 編集日時 2009-01-16 13:05 ] | ||||
|
投稿日時: 2009-01-16 18:56
ありがとうございます。
スマートに記述できて見やすいですね。 勉強しておきます。 |
1