文字列を特定の場所に分割

文字列を特定の場所に分割

問題がありますが、解決策を知りたいですsed。私の場合、変数を特定の位置に切り取るにはどうすればよいですか_g

はい

variable="This_is_good_g0r0s0_continues"

この変数を_g_g

答え1

すべてのPOSIXシェルで内部変数拡散演算子を使用してこれを実行できます。

variable="This_is_good_g0r0s0_continues"
up_to_first__g="${variable%%_g*}"
up_to_last__g="${variable%_g*}"

答え2

最後に切り取るには_g:

$ sed 's/\(.*\)_g.*/\1/' <<< 'This_is_good_g0r0s0_continues'
This_is_good

_gまず切りたい場合

$ sed 's/_g.*//' <<< 'This_is_good_g0r0s0_continues'
This_is

答え3

BRE - with sed- を使用すると、発生回数を数えて一致するシーケンスを断片化できます。私はこれがシェルvar値をスライスするための理想的なツールだとは思わないsed。シェルはすでにこれを行うためのかなり直感的な方法を提供していますが、それは扱いました。

BREパターンシーケンスは、乗算時に可能な限り右に分割されます。たとえば、

echo 0123456789 | sed 's/\([0-9]\)*/\1/'

... 9を印刷してください。ただし、実際の数に基づいて分割するとより便利になります。

他の例:

echo _good _goroso _goes _gop |
sed 's/\(.*_g\)\{2\}/\1/'

...これは...

oes _gop

しかし、これはあなたが思うようには機能しません。または、少なくとも私が使い始めたときに期待どおりに機能しませんでした。あなたは_gそこに戻ることはできません\{3\}。とにかくこの状況ではそうではありません。このパターンは非常に可変であり、すべてと一致する.*ため、簡単に定量化することは困難です。あなたは何ですかできるあなたがしなければならないことはそれを分割するだけです。

echo _good _goroso _goes _gop |
sed 's/\(\(.*_g\)\{2\}\)\{2\}/\1/'

...印刷

oroso _goes _gop

たぶん、より良い表現はこんな感じです。絞る今見えるより分ける。ここでは.*、パターンの複数の発生を少なくとも0回以上一致させることで、可能な一致を効果的に制限しています。これは常に可能な限り貪欲です。だから、一致する端から最も小さい部分を切り取った。

&これは、ゲーム自体を見ると、より簡単に知ることができます。すでにゲーム内のゲームに加えて、まだ利用可能なゲームがあります\1。個人的に私はしばしばこの特徴が役に立つと思いますが、この病気を患っている人が私だけであるという事実を知っても驚かないでしょう。たとえば、次のように、両端で一致する項目を複合的に使用できます。

echo _good _goroso _goes _gop |
sed 's/\(\(.*_g\)\{2\}\)\{2\}/&\1/

...印刷:

_good _goroso _goes _goroso _goes _gop

...完全一致は.*_gあります&が、セグメンテーションパターンはその一部にすぎないからです。

...でも...

echo _good _goroso _goes _gop |
sed 's/\(\(.*_g\)\{2\}\)\{2\}/\2&\1/

...これはゲームのさまざまなレベルを混ぜることです。たとえば...

oes _g_good _goroso _goes _goroso _goes _gop

関連情報