
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