- ベストアンサー
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"のような状態)になっても対応できるような、シンプルな書き方はないでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こういうのは、expr がシンプルです。 NODE1STR=`expr "$STRING" : '.*"\(.*\):.*"'` NODE2STR=`expr "$STRING" : '.*".*:\(.*\)"'` 正規表現の中の、\( \) で囲んだ部分を返してくれます。 ところで、0バイトだとどうなりますか?手元の環境だと問題なし。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
う~ん, 0バイトであっても別に困ることはないと思うんだけど... 何がどう困るんだろう. もっとシンプルに考えるなら, sed で「" から : まで」とか「: から " まで」とかやってもいいのかもしれない. NODE1STR=`echo $STRING | sed -e 's/.*"\([^:]*:\).*/\1/'` とか, かなぁ.
お礼
アドバイスありがとうございます。 「0バイトで困る」の件は、机上で考えていたときにNODESTR1にnode2の文字が入ってしまうのでは、と悩んでいました。 こちらも実機で確認して、問題ないことを確認しました。 この質問では引き続き、よりシンプルな表現をアドバイスいただきたく思います。
お礼
アドバイスありがとうございます。 「0バイトで困る」の件は、机上で考えていたときにNODESTR1にnode2の文字が入ってしまうのでは、と悩んでいました。 こちらも実機で確認して、問題ないことを確認しました。 この質問では引き続き、よりシンプルな表現をアドバイスいただきたく思います。