- PR -

シェルでの文字列操作について

1
投稿者投稿内容
ライト万
常連さん
会議室デビュー日: 2007/04/02
投稿数: 22
投稿日時: 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つ入ります。

以上です。よろしくお願いいたします。





_________________
deanna
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 118
投稿日時: 2009-01-15 21:55
引用:

ライト万さんの書き込み (2009-01-15 19:32) より:

「aaa_bbbb_ccc1」という文字列を参照して、
「aaa1」という形で変数に設定したいです。




規則がわかりません。そこを明確にして下さい。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 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

※掲示板の都合上¥は全角にしてあります。
ライト万
常連さん
会議室デビュー日: 2007/04/02
投稿数: 22
投稿日時: 2009-01-16 11:25
ルールの説明不足の中、
ありがとうございます。
パーフェクトな結果です。感動しました。

ただ、[0-9]の後ろの"]"が抜けていたので、追記して対応しました。

NAME_1=`echo $NAME | grep -o '^[a-z]¥+'``echo $NAME | grep -o '[0-9]¥+$'`

以上です。ご協力ありがとうございました。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 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 ]
ライト万
常連さん
会議室デビュー日: 2007/04/02
投稿数: 22
投稿日時: 2009-01-16 18:56
ありがとうございます。

スマートに記述できて見やすいですね。
勉強しておきます。
1

スキルアップ/キャリアアップ(JOB@IT)