大家好,这是我在Bash的问题, 我试图找到第二次出现的特殊情况' _'一旦我发现它删除了该字符和其右边的任何其他字符。这是可视化:
String: foo_bar_v20.9_FUBAR
Output : foo_bar
主要问题是我无法找到找到第二个' _'的最佳方法。一旦我在那里,我应该使用它的位置做这样的事情:
echo $editedString | cut -c 2ndUnderlineLocation- | rev
-Chris
答案 0 :(得分:0)
使用正则表达式:
$ string="foo_bar_v20.9_FUBAR"
$ [[ $string =~ ([^_]*_[^_]*)_ ]]
$ echo ${BASH_REMATCH[1]} # First capture group
foo_bar
捕获组捕获第一个_
之前的所有非_
个字符
第一个_
以及下一个_
之前的所有非_
个字符。
(还有这种符合POSIX标准的怪物......
echo ${string%_${string#${string%%_*}_*_}}
但除非绝对必要,否则最好避免。它看起来很糟糕,但您可以按照以下步骤逐步构建它:
# What appears just before the first _?
$ x=${string%%_*}
$ echo $x
foo
# Use that as a prefix to remove, along with everything up to the next _
$ y=${string#${x}_*_}
$ echo $y
v20.9_FUBAR
# Remove *that* as a suffix
$ echo ${string%_${y}}
foo_bar
)
答案 1 :(得分:0)
这有效:
echo "foo_bar_v20.9_FUBAR" | rev | sed -r 's/.*_(.*_.*)/\1/g' | rev
据我所知,sed
不支持非贪婪匹配,因此此处使用rev
。