Bash找到char并删除右边的所有内容

时间:2014-05-20 18:18:35

标签: linux bash scripting

大家好,这是我在Bash的问题, 我试图找到第二次出现的特殊情况' _'一旦我发现它删除了该字符和其右边的任何其他字符。这是可视化:

String: foo_bar_v20.9_FUBAR
Output : foo_bar

主要问题是我无法找到找到第二个' _'的最佳方法。一旦我在那里,我应该使用它的位置做这样的事情:

echo $editedString | cut -c 2ndUnderlineLocation- | rev

-Chris

2 个答案:

答案 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