bash:一个参数替换:字符串的开头和结尾

bash:一个参数替换:字符串的开头和结尾

这个问题不是关于如何使用 或类似工具来完成此sed任务grep请不要用这些来回答


我有一个字符串(它可以是具有相同结构的任何字符串foofoo_barbar等):

.foo_bar.kate-swp

我只需要检索一个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

相关内容