• ベストアンサー

kshでの文字列操作

以下の文字列のうち、node1,node2部分を取り出したいです。 -------------------------------------------------------- rg non-concurrent PRIMARY="node1:node2" -------------------------------------------------------- このnode1,node2の部分は0~20バイト程度で変動します。 1バイト以上あればawkなどを組み合わせることで取り出すことができると思いますが、0バイトの場合があるため扱いに困っています。 いまこちらで考えているもの(1バイト以上の場合)は以下のような記法です。 STRING='rg non-concurrent PRIMARY="node1:node2"' NODE1STR=`echo $STRING | awk -F\" '{print $2}' | awk -F: '{print $1}'` NODE2STR=`echo $STRING | awk -F\" '{print $2}' | awk -F: '{print $2}'` awkを二重にしている箇所は-Fの引数を正規表現すれば短縮できるかもしれません。 このnode1部分がゼロバイト(PRIMARY=":node2"のような状態)になっても対応できるような、シンプルな書き方はないでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

こういうのは、expr がシンプルです。 NODE1STR=`expr "$STRING" : '.*"\(.*\):.*"'` NODE2STR=`expr "$STRING" : '.*".*:\(.*\)"'` 正規表現の中の、\( \) で囲んだ部分を返してくれます。 ところで、0バイトだとどうなりますか?手元の環境だと問題なし。

awk_novice
質問者

お礼

アドバイスありがとうございます。 「0バイトで困る」の件は、机上で考えていたときにNODESTR1にnode2の文字が入ってしまうのでは、と悩んでいました。 こちらも実機で確認して、問題ないことを確認しました。 この質問では引き続き、よりシンプルな表現をアドバイスいただきたく思います。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

う~ん, 0バイトであっても別に困ることはないと思うんだけど... 何がどう困るんだろう. もっとシンプルに考えるなら, sed で「" から : まで」とか「: から " まで」とかやってもいいのかもしれない. NODE1STR=`echo $STRING | sed -e 's/.*"\([^:]*:\).*/\1/'` とか, かなぁ.

awk_novice
質問者

お礼

アドバイスありがとうございます。 「0バイトで困る」の件は、机上で考えていたときにNODESTR1にnode2の文字が入ってしまうのでは、と悩んでいました。 こちらも実機で確認して、問題ないことを確認しました。 この質問では引き続き、よりシンプルな表現をアドバイスいただきたく思います。

関連するQ&A