bash:引数の置換1つ:文字列の始まりと終わり

bash:引数の置換1つ:文字列の始まりと終わり

sedこの質問は、このタスクを実行するために同様のツールを使用する方法に関するものではありませんgrepこの回答を使用して回答しないでください


文字列があります(同じ構造を持つ任意の文字列にすることができますfoofoo_barbar)。

.foo_bar.kate-swp

1つしか検索できませんので、開始と終了をfoo_bar削除してください。次の中間変数を使用できることがわかります。..kate-swp

foo=".foo_bar.kate-swp"
foo="${foo#.}"
foo="${foo%.*}"
echo "$foo"
foo_bar

しかし、短時間で終わることができるかどうかを知りたいです。一つ置換。私は次のような努力をしています。

echo "${foo/!(*[a-z]).kate-swp/}"
.foo_bar

しかし、

# just an example of my failures
echo "${foo/.!(*[a-z]).kate-swp/}"
.foo_bar.kate-swp

たぶんそれは単に不可能かもしれませんが、可能であれば私はいつも学びたいです。

ベストアンサー1

Bashのいくつかの回避策:

キャプチャに一致する正規表現:

$ foo='.foo_bar.kate-swp'
$ [[ $foo =~ ^[.]([^.]+) ]] && echo ${BASH_REMATCH[1]}
foo_bar

文字列を点の一部に分割します。

$ foo='.foo_bar.kate-swp'
$ IFS=. read -r x var y <<< "$foo"; echo "$var"
foo_bar

しかし、実際には、Bashで拡張機能を便利な方法で入れ子にすることはできません。これは${var/pattern/replace}実際には機能しませんでした。なぜなら模様文字列の隣接部分と一致する必要があり、正規表現スタイルのキャプチャグループは必要ありません(例:no s/xxx(main)yyy/\1/)。

ただし、Zshでは拡張をネストできます。

zsh% foo='.foo_bar.kate-swp'
zsh% echo ${${foo#.}%%.*}'
foo_bar

おすすめ記事