bash環境で、下記文字列編集をする方法を提示してください(gawk,sedはインストール済みです)。

(1)AAA BBB(MOJIRETSU) CCC
という文字列から、「MOJIRETSU」だけ取り出す。「MOJIRETSU」は可変長の文字列。
(1)AAA BBB(999) CCC
という文字列から、「999」だけ取り出す。「999」は可変長の数値。
要は正規表現などを用いて、カッコ内の値を取り出しただけなのです。
イメージとしてはコマンドで
$ATAI=`echo "AAA BBB(999) CCC" | なにかの処理`
を行って、ATAIにカッコ内の文字列や数値を入れたいのです。
よろしくお願いします。
※そういうことをやりたいのであればこういう知識やページを知っておいたほうがよいよ、という参考ページも提示していただけると助かります。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/06/20 15:33:43
  • 終了:2010/06/24 23:31:12

回答(2件)

id:shintabo No.1

shintabo回答回数45ベストアンサー獲得回数102010/06/20 18:36:16

ポイント35pt

# sed

echo "AAA BBB(999) CCC" | sed 's/.*(\(.*\)).*/\1/'

用途は、ログの集計などでしょうか?

たぶん、Perlを使った方が後々よいと思います

# perl

echo "AAA BBB(999) CCC" | perl -e '<STDIN> =~ /\(([^\)]+)\)/;print $1'

# enjoy perl

http://modperlis.bounceme.net/

id:sls

ありがとうござます!

perlもインストールされているのですが、あくまでシェルの中での処理の一部なので・・

私もperlとか使いたいのですが。。。

sedの/\1/というのは、正規表現の1番目(0からかぞえてだと2番目)という意味と解釈すればよいでしょうか。

2010/06/20 18:49:35
id:shintabo No.2

shintabo回答回数45ベストアンサー獲得回数102010/06/20 19:04:56

ポイント35pt

> sedの/\1/というのは、正規表現の1番目(0からかぞえてだと2番目)という意味と解釈すればよいでしょうか。

グループ化された1番目という意味です。

sedでは、\(.*\) がグループ化です。

( ) で囲まれた1個目のグループなので、999となります。

古い記事ですが、

http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231161/

にいろいろ書いてありますので、見てください。

id:sls

なるほど、ありがとうございます。とても勉強になりました。

2010/06/20 19:18:11
  • id:Mook
    このあたりが参考になりませんか。
    http://d.hatena.ne.jp/Rocco/20071120/p6

    ちょっと冗長な気もしますが、

    echo "AAA BBB(MOJIRETSU) CCC" | awk ' match($0,/\(\w+\)/) { print substr($0,RSTART + 1,RLENGTH - 2) }'
    で出るかと思います。
  • id:sls
    ありがとうございます。
    なるほど、RSTARTとRLENGTHを使うのがコツですね。
    正規表現のw+の部分がわからないので調べてみます。
  • id:t-wata
    こんな単純な抜き出しなら、普通にやっていいと思うけど、複雑で長いものから抜き出す場合、いきなり1つの正規表現を組もうとせずに、
    cat hoge.txt | sed -e 's/foo//' -e 's/bar//' -e 's/hoge//'
    みたいに、明らかな不要部分を切り取るだけの正規表現を作って、それを1つずつ増やしてその都度確認しながら組んでいくと楽ですよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません